C语言数据的存储

1. 整数在内存中的存储

        int型整数在计算机存储中占用4个字节,但是正数与负数的存储形式不同。

1.1 原码反码补码

         计算机中,整数的三种表示方法为:原码、反码、补码,并且最终存储的是整数的补码。三种表示方法均为有符号位和数值位两部分,其中,符号位都是用0表示正,用1表示负。其中,正数的原反补码相同。

        无符号数的原反补码相同。

        原码为将整数带符号直接转换为二进制。负数的反码为符号位不变,数值位按位取反;补码为反码加1.

        计算机采用补码存储整数是因为,计算机中只有加法器没有减法器,采用补码可以将加减法统一运算。

1.2 大小端

        大端模式:数据的低位保存在内存中的高地址,高位保存在低地址;

        小端模式:数据的低位保存在内存中的低地址,高位保存在高地址。

        值得注意的是,大小端描述的是字节的存放的顺序,而不是二进制位的存放顺序。一个字节8位,16进制2位数。

        内存中,地址从左到右,是由低变高的,而数据中,左边是高位,右边是低位,VS编译器采用的是小端存储。

2. 浮点数在内存中的存储

        根据IEEE规定,任何一个浮点数可以表示为如下的形式:

        (-1)^s * M * 2^E

        (-1)^s为符号位,当s=0时为正数,1时为负数;

        M表示有效数值,大于等于1,小于2;

        2^E表示指数位。

        对于32位的单精度浮点数,最高的1位是符号位S,接着8位是指数E,剩下的23位为有效数字M。

        对于64位的双精度浮点数,最高的1位是符号位S,接着11位是指数E,剩下的52位为有效数字M。

        IEEE对于(有效数字)M和(指数)E有特殊的规定: (以float为例)

        对于M:因为M的值一定是1<= M <2,所以它绝对可以写成1.xxxxxxx的形式,所以规定M在存储时舍去第一个1,只存储小数点之后的数字。这样做节省了空间,以float类型为例,就可以保存23位小数信息,加上舍去的1就可以用23位来表示24个有效的信息。

        对于E:首先,E是一个无符号的数,因此,如果E是8位,则其取值范围为0~255;如果E是11位,则取值范围为0~2047.但是科学计数法中的E是可以出现负数的,因此规定E在内存中存储时必须要加上一个中间数,8位加127,11位加1023,比如2^10的E为10,对于32位单精度浮点数,保存为127+10 = 137,即为10001001.
        对于E还分为三种情况:
        ①E不全为0,不全为1:
        这时就用正常的计算规则,E的真实值就是E的存储二进制转换过来的值减去127(中间值),M的值要加上最前面的省去的1。
        ②E全为0
        这时指数E等于1-127为真实值即-126,M不在加上舍去的1,而是还原为0.xxxxxxxx小数。这样为了表示±0,和一些很小的整数。所以在进行浮点数与0的比较时,要注意。
        ③E全为1
        当M全为0时,表示±无穷大(取决于符号位)。

        

猜你喜欢

转载自blog.csdn.net/MLuhuihui/article/details/120853993