在计算机的内存当中,整数和浮点数的存储方式可谓是大相径庭
这篇文章整理了关于整数在内存中的存储,以及较为复杂的浮点数在内存中的存储 ,希望能够帮到大家,望多支持!!!
目录
1.整数的存储
整数在内存中以二进制的形式存储,存储的是其补码。要清楚这点,我们需要知道三个概念:
- 原码:就是整数直接转化为二进制的形式。
- 反码:符号位不变,其他位按位取反。
- 补码:反码加一得补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位最 高位的⼀位是被当做符号位,剩余的都是数值位。
要注意:
- 对于正数:原码,反码,补码都相同!
- 对于负数:原反补符合以上规则。
举个例子:
15 原码 00001111
反码 00001111
补码 00001111(都相同)
-15 原码 10001111
反码 11110000(符号位不变,其他位按位取反)
补码 11110001 (反码加一)
2.浮点数的存储
首先,任意⼀个二进制浮点数V可以表示成下面的形式: V = (−1)^S * M * 2^E
- (−1)^S 表示符号位,当S=0,V为正数;当S=1,V为负数
- M 表示有效数字,M是大于等于1,小于2的
- 2^E 表示指数位
举个例子:
十进制的6.0,写成二进制是 110.0 ,相当于 1.10×2^2 。 那么,按照上面V的格式,可以得出S=0,M=1.10,E=2。
十进制的-6.0,写成二进制是 -110.0 ,相当于 -1.10×2^2 。那么,S=1,M=1.10,E=2。
IEEE 754规定:
对于32位的浮点数(float),最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M,
对于64位的浮点数(double),最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M 。
32位浮点数存储如下图所示:
浮点数存的过程
IEEE 754 对有效数字M和指数E,还有一些特别规定:
1.对于有效数字M:
我们知道M的取值范围是大于等于1,小于2,所以M的个位就是1,既然如此,我们就可以不用存储这个1,直接存储后面的小数,等到读取的时候再将1加上。这样能够存储的有效数字就从23位变成了24位。
2.对于指数E:
一定要清楚,E是个无符号整型!
但是对于科学计数法来说,指数位可能会出现负数,为了让E保持为正,计算机在存储E的时候会先加上一个中间数再存进去。
对于32位浮点数,中间数就是127(2^7-1); 对于64位浮点数,中间数就是1023(2^10-1)。
浮点数取的过程
指数E从内存中取出还可以再分成三种情况:
E不全为0或1:
那么浮点数取出来的时候就应该是:指数E的计算值减去127(或1023),得到真实值,再将有效 数字M前加上第一位的1。如:
0 10001011 11011000000000000000000
E全为0:
由于E是真实值加上127(1023)得到的数,那么如果E全为0,则真实的数可能就是1*2^-127,是一个无限接近于0的数,所以其在取出来的时候,有效数字M就不再加1,而是加0,这样会更加接近真实值。如:
0 00000000 01110000000000000000000
E全为1:
表示一个无穷大的数(正负取决于符号位S),如:
0 11111111 01000000000000000000000