【C语言】整数,浮点数在内存中是如何存储的

整数在内存中的存储 


整型数就是通常使用的整数,分为无符号整数和带符号整数两大类。 
整型数在内存中是以二进制形式存放的,实际上,数值是以补码的形式表示的。在机器中用最高位表示数的符号,正数符号用“0”表示,负数符号用“1”表示。

这里根据设备平台不同,大小端介绍,一般PC都是小端字节序: 
大端:数据的低字节存在高地址处。 
小端:数据的低字节存在低地址处。

原码、反码、补码

原码、反码、补码都是针对二进制位而言的,这里用-10做演示。
【C语言】整数,浮点数在内存中是如何存储的
其实计算机中表示数字都是使用补码方式表示的,至于为什么,在下面会讲到

  • 正数的补码和原码相同。
  • 负数的补码是原码取反加一。

补码表示数字的优势在于:
可以把加减法运算统一变成加法运算,因为CPU只有加法器,所以只使用加法器就可以完成了。这就是为什么用补码表示。
这样可以间接减少硬件成本,例如1 - 10这个减法运算就可以在内存角度用加法计算出结果了:

【C语言】整数,浮点数在内存中是如何存储的

 

浮点数在内存中的存储 


浮点数在计算机中是按指数的形式存储,即把一个浮点数分为小数和指数两部分。

浮点数的表示形式:

根据国际标准IEEE754,任意一个二进制浮点数可以表示成下面的形式

(-1)^S * M *2^E
(-1)^S表示符号位,当S=0,V为整数;当S=1,V为负数。
M表示有效数字,大于等于1,小于2.
2^E表示指数位

举例:

  1. 十进制的5.0,写成二进制是 101.0 ,相当于 1.01×2^2 。 那么按照上面格式,可以得出s=0,M=1.01,E=2。
  2. 十进制的-5.0,写成二进制是 -101.0 ,相当于 -1.01×2^2 。那么s=1,M=1.01,E=2。

 【C语言】整数,浮点数在内存中是如何存储的

注:64位浮点数除了符号位和32位浮点数相等,其他E或者M都比32位的数字要大。

  • E(指数位):越大说明数据表示的范围越大
    32位中占8位,64位占11位。
  • M(有效数字):越大说明数据精度越高
    32位中占23位,64位占52位。