C/C++ 内存中的数据表示

作者: 铁甲万能狗 | 来源:发表于2019-09-19 19:10 被阅读0次

这篇文章假设你已经基本了以下的基础

  • C的基本数据类型有了一定的了解
  • 了解基本的进制转换算法

这是C/C++内存管理系列文章的第一篇,主要讲述C中基本的数据类型如何在内存中表示.

RAM是计算机的主要或主要内存。 它是执行程序时存储文本,数据,指令和中间结果的地方。 总存储器被组织成字节数,每个字节再次被分成8位。 位是存储器中的最小单元,这些位是将数据存储为1和0的位置,称为二进制数据。 在存储器中,每个字节用一个称为地址的数字标识。 它总是一个正数。


计算机内存寻址模型

在执行程序时,总内存被分为多个段,称为文本,未初始化的全局,初始化的全局,堆栈和堆段。 将整个程序加载到文本段中,并在堆栈存储器中选择存储器到变量.
备注:关于堆栈的内存话题,这个会另行写文,这里就不展开了

内存中的整数表示:

例如,当我们将数字148分配给变量x时,数字148首先转换为其相等的二进制10010100,然后存储到存储器中。 即使使用浮点数也会发生同样的事情。

在C/C++中如果声明一个signed int类型的便来唔那么在内存中就会启用MSB(最高有效位)位用于指示该数字是正数还是负数。
对于正数,MSB将为0
对于负数,MSB将为1
在我们的例子中,148为正,所以MSB为0。

这个等效的148的二进制文件将存储在32位内存中,如下所示,


INT-REN.png

负整数如何存储在内存中?

计算机使用特殊机制来存储负数,这是2的补码格式。
在开始之前,让我们应该要知道1的数字补码

  • 1的数字补码:1的数字补码只是反转实际数字的二进制位。
    那么以整数10为例,它的二进制是1010,
  1. 10的1补码形式"0101"(仅是各位上0切换到1,1切换到0)
  2. 获取2补码形式只需加1到1之后得到实数补码即可
    netgative.png
    以上该2的补码形式就表示负数-10,存储在指定的内存空间中

内存中的浮点数表示

要存储浮点数,将在计算机中分配4字节(32位)内存。
1位用于MSB标记正/负
指数部分为8位
有效小数位是23位

十进制的浮点数转换二进制形式,这里用一个简单的示例step by step讲解

  1. 浮动数字将转换为二进制数字,例如我们将10.75转换为二进制形式1010.11
  2. 将转换后的二进制数转换成科学记数法的形式,具体如下步骤,小数点左移后小数点左边保留1位二进制数,小数点右边的是有效小数位(significant bit)
    exponent.png
  3. 向指数添加偏差
    在浮点数中,并不像有符号整数那样存在2的补码形式来存储负数。 为了克服这一点,设计计算机的大牛们提出了偏置值(bias)概念,我们在负指数中加上一些正值并使其成为正数。

通常,无论它是负还是正,它们都会将偏差值添加到指数值,以降低实现复杂性。
计算偏置值的公式如下:

for.png
这里,由于32位的浮点数为指数分配了8位, 所以n将是8,那么套公式,2的7次幂减1就是127.
因此,科学记数形式中的指数,就会是当前指数+偏置值,即3+127=130,然后将130转化为二进制形式就是10000010
result.png

将标记0置号,因为10.75是正数
指数值为130,即(10000010)2
有效小数位是1.01011,这里我们可以将小数点之前消除1,因为无论我们总是二进制科学记数化形式为1.???*2^n这种形式.所以,不需要存储1.只需存储小数点后面 有效小数位,这个例子就是01011

float.png

内存中的double类型的数据表示

要存储double类型的数据需要分配8字节(64位)内存空间。

  • 1位用于MSB
  • 11位为指数
  • 52位表示有效小数位

double和float表示之间的唯一区别是偏置值。这里我们使用11位表示指数,十进制转换二进制的算法都是一样,没必要废话.

内存中的字符表示:

数据来源于网络

与数字数据一样,即使字符不能按原样存储,因为计算机只知道二进制数系统,它也会首先转换为相等的二进制数,然后存储到存储器的位中。 键盘上的每个字符都具有相等的二进制值。 等于该二进制值的十进制数称为ASCII(美国信息交换标准代码)值。 比如说字符'A'的二进制值是01000001,十进制等于65.所以'A'的ASCII值是65.为了存储字符值,计算机将分配1字节(8位)内存.


字符字面量在内存中的表示

备注:这里我并不会详细谈论更复杂的字符集

相关文章

  • 开篇2:C/C++ 内存布局与程序栈

    如果你对C/C++基本数据类型的内存模型没概念的话,可以先查看该传送门《开篇1:C/C++ 内存中的数据表示》,反...

  • 听说你了解数据类型?

    学过C++、C或者Java的程序员都知道,存储在内存中的数据是有类型的,C中用int表示整型,float表示浮...

  • C/C++ 内存中的数据表示

    这篇文章假设你已经基本了以下的基础 C的基本数据类型有了一定的了解 了解基本的进制转换算法 这是C/C++内存管理...

  • 内存管理

    内容包括: C++内存管理 Java内存管理 C++内存管理 内存分配方式 在C++中,内存分成5个区,分别是栈、...

  • C++中New关键字和命名空间

    动态内存分配 C++中的动态内存分配C++中通过new关键字进行动态内存申请C++中的动态内存申请是基于类型进行的...

  • Java内存泄漏

    本文将会介绍: C++中的内存泄露 Java内存管理与垃圾回收 Java中的内存泄漏 一、C++中的内存泄露 在大...

  • C++中的新成员

    C++中的动态内存分配 C++中通过new关键字进行动态内存申请 C++中的动态内存申请是基于类型进行的 dele...

  • C++之内存布局

    在C++之内存管理一文中,我们已经了解到C++的内存管理,这里介绍C++的典型内存布局结构。 1、总体来说,C/C...

  • 第1篇:CPython实现原理:万物皆为PyObject

    对象的定义 在C/C++中,对象就是堆(Heap)内存中的内存实体,从简单的基本数据类型(int,float,ch...

  • C++ 中的变量

    C++ 中的变量内存数据类型 C++ 数据类型 使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的...

网友评论

    本文标题:C/C++ 内存中的数据表示

    本文链接:https://www.haomeiwen.com/subject/gkgructx.html