网站建设营销推广,怎么设计手机网站,网站建设与制作教案,网站建设与网页设计...浮点数在内存中的存储 浮点数存储规则小数点后数值的二进制转换float和double存储图示优化存储方案E不全为0或不全为1E全为0E全为1 浮点数存储规则
大家都知道整型数据是以补码的方式存放在内存中。以下几个概念是需要知道的#xff1a;
原码#xff0c;补码#xff0c;反… 浮点数在内存中的存储 浮点数存储规则小数点后数值的二进制转换float和double存储图示优化存储方案E不全为0或不全为1E全为0E全为1 浮点数存储规则
大家都知道整型数据是以补码的方式存放在内存中。以下几个概念是需要知道的
原码补码反码都是以二进制形式表示的。正整数的原码反码补码都相同。负整数的补码反码1原码的符号位不变数值位按位取反。 但是浮点数不同浮点数有着一套自己的存储规则。 根据国际标准IEEE电气和电子工程协会 754任意一个二进制浮点数V可以表示成下面的形式 (-1)^S * M * 2^E(-1)^S表示符号位当S0V为正数当S1V为负数。M表示有效数字大于等于1小于2。2^E表示指数位。E是一个无符号整数。 小数点后数值的二进制转换
大家对于整数的二进制转换是了熟于心但是往往会忽略了小数的二进制转换。 7.25
例如上面的十进制数字7.25小数点前的7可以转换为 4 2 1 2 2 2 1 2 0 111 4212^{2}2^{1}2^{0}111 421222120111 小数点后的数值0.25转换为 1 4 1 2 2 2 − 2 . 01 \frac{1}{4}\frac{1}{2^{2}}2^{-2}.01 412212−2.01 所以 7.25111.01 所以按照规则用float来存储7.25的话
7.25111.01 ( − 1 ) 0 ∗ 1.1101 ∗ ( 2 ) 2 (-1)^{0}*1.1101*(2)^{2} (−1)0∗1.1101∗(2)2
S0M 1.1101E 2
float和double存储图示 IEEE 754规定 对于32位的浮点数最高的1位是符号位S接着的8位是指数E剩下的23位为有效数字M。 对于64位的浮点数最高的1位是符号位S接着的11位是指数E剩下的52位为有效数字M。 优化存储方案
前面提到的规则是0M1。这就导致当浮点数不为0时M一定是1.***这样的格式的小数点前面一定会有一个1。每次都存储这个1显得冗余浪费空间。因此IEE 754规定存储在内存中时去除掉小数点前的1只将小数点后面的二进制数值存进去。
下面我们来看一种情况 0.5的存储 ( 0.5 ) 10 (0.5)_{10} (0.5)10 ( 0.1 ) 2 (0.1)_{2} (0.1)2 ( − 1 ) 0 ∗ 1.0 ∗ ( 2 ) − 1 (-1)^{0}*1.0*(2)^{-1} (−1)0∗1.0∗(2)−1 我们会发现一个特别的现象E-1前面说过E是一个无符号整数那这个-1该怎么存储呢 IEE 754规定 存入内存时E的真实值必须再加上一个中间数对于8位的E这个中间数是127对于11位的E这个中间数是1023。比如2^10的E是10所以保存成32位浮点数时必须保存成10127137即10001001。 所以这里是float类型E-1存储时加上127也就是真正存入内存的是-1127126。 另外E从内存中取出还有三种情况值得我们注意
E不全为0或不全为1
这就是上面我们讨论的那种情况
如果是float类型的取出来的数直接减去127就可得到E的真实值。如果是double类型的取出来的数直接减去1023就可得到E的真实值。
E全为0
这个作为特殊对待如果E全为0说明真实值为-127也就是这个数是一个 1 2 127 \frac{1}{2^{127}} 21271的这已经是一个很小很小的数了无限接近于0了。 因此IEEE 754规定
如果是float类型的E全为0时E1-127(可不是前面说的-127那只是举例)。如果是double类型的E全为0时E1-1023既然此时数值无限接近0那么M也就不需要再加上1但是S依旧需要用来标识±0。
E全为1
这时如果有效数字M全为0表示±无穷大正负取决于符号位s 创作不易你的点赞和关注都是对我莫大的鼓励再次感谢您的观看