首先,我们来一起探讨一下整数在内存中的存储。
整数在内存中的存储
整数在内存中的存储分为原码,反码,补码之分。
对于正数而言,原反补码相同。
对于负数而言,原反补均不一样。
原码通过取反可以得到反码,反码加1则可以得到补码。补码亦是如此,补码取反加一可得到原码。
对于不同的机器,整数在内存中的存储分为大端存储和小端存储。
那么什么是大小端呢?
大端(存储)模式:是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处。
小端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存在内存的高地址处。
那么怎么区分自己的电脑端是大端存储还是小端存储呢?
我们可以通过对1的二进制的第一个字节进行比对。如果为1则说明为小端存储,否则为大端存储。
浮点数在内存中的存储
根据国际标准IEEE(电⽓和电⼦⼯程协会)754,任意一个二进制浮点数V可以表示成下面的形式:
V = (−1)^S∗M ∗2^E
• (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数
• M表示有效数字,M是大于等于1,小于2的
• 2^E表示指数位
IEEE 754规定:
对于32位的浮点数,最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
对于64位的浮点数,最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
IEEE 754对有效数字M和指数E,还有⼀些特别规定。
1.因为1<=M<2,所以在保存M时,小数点前面的1常常省略。例如:M=1.02,存储的时候我们只保存02,等到读取的时候在把1加上去。这样做的目的是节省一个有效数字。 以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保存24位有效数字。
2.E为⼀个无符号整数
如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存⼊内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。
<<<<<读取浮点数时:指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第⼀位的1。>>>>>
接下来,我们看一个题目来直观的感受一下浮点数的存储!
结果为 9、 0.000000、 1091567616、 9.0
首先,将 9 的⼆进制序列按照浮点数的形式拆分,得到第⼀位符号位s=0,后⾯8位的指数
E=00000000 ,最后23位的有效数字M=000 0000 0000 0000 0000 1001。
由于指数E全为0,所以符合E为全0的情况。因此,浮点数V就写成:
V=(-1)^0 × 0.00000000000000000001001×2^(-126)=1.001×2^(-146)
显然,V是⼀个很小的接近于0的正数,所以用十进制小数表示就是0.000000。
再看第2环节,浮点数9.0,为什么整数打印是 1091567616
首先,浮点数9.0等于⼆进制的1001.0,即换算成科学计数法是:(-1)^0*(1.001)*2^3
那么,第⼀位的符号位S=0,有效数字M等于001后⾯再加20个0,凑满23位,指数E等于3+127=130,即10000010
这个32位的⼆进制数,被当做整数来解析的时候,就是整数在内存中的补码,原码正是
1091567616 。