在了解浮点数在内存中的存储之前,我们先了解一下整数在内存中的存储。
整数就是直接以二进制的形式存储且存的都是补码,其有正负数之分,整数的原码、反码、补码相同,负数则是原码按位取反得反码,反码+1=补码,如果是负数,其最高位为1(其从原码到补码得过程中符号位不参与运算),如果是正数,最高位为0。如2在内存中就是00000000000000000000000000000010,-2就是原码就是10000000000000000000000000000010,反码就是11111111111111111111111111111101,补码就是11111111111111111111111111111110。整数如此,那么浮点数呢?我们可以通过代码进行验证。
很显然,其与我们得猜测并不同,因此,我们推测浮点数在内存中的存储与整形的不同。通过查阅资料我们可知,浮点数在内存中的存储是根据 IEEE 754标准来规定的。
第二段中说其规定了四种浮点数的存储方式,这里我们只讨论前两种(单精度和双精度)。
根据标准规定,任何一个浮点数都可以表示为这样的形式:
对于32位的单精度浮点数,最高的一位为符号位S,接着8位是指数E,剩下的23位是有效数字M。
对于64位的双精度浮点数,最高的一位为S,接着11位是指数E,剩下的52位是有效数字M。
指数E:E为无符号数,E为8位(取值范围为0~255),如果为11位(取值范围为0~2047)。因为科学技术法中的E是可以出现负数的,因此在存入内存中时,E的真实值必须加上一个中间数,对于8位的E中间数为127,对于11位的,中间数为1023。
有效位M:因1<=M<2,也就是说M为1.xxxxxx的形式,其中xxxxx为小数部分,因为M第一位总为1,因此可以舍去,等读取时,再把第一位加上去,目的是节省1位有效数字。
如图所示,浮点数在内存中的存储便是如此。
最后,我们就来分析最开始的题目。
到此,我们对浮点数在内存中的存储有了一定的了解。
标签:存储,反码,浮点数,补码,内存,原码 From: https://blog.csdn.net/friendhan2005/article/details/136762384