1. 摘要
在了解到C语言中整型是以二进制补码形式存储在内存中后,我们不禁很好奇:那么浮点型的数据是以什么形式存储在内存中的呢?
实际上,早在1985年,电气电子工程师学会就制定了IEEE 754标准来解决单精度浮点数在计算机内存中的存储问题。
那么接下来,我们就以IEEE754-1985版来看一看浮点数在内存中的真实面目。
2. 浮点数的表达方式
2.1 浮点数的组成
浮点型家族中包含有:float、double、long double类型
IEEE 754标准下,一个浮点数V可以被拆解成三个部分
V = (-1) ^ S * f * 2 ^ E
- 1-bit sign S ------ 符号位S,用来表示正负
- Biased exponent e = E+bias:指数位,负责浮点数的大小
- Fraction f = · b1b2 … bp−1:小数位,负责浮点数的精度,且f大于等于1小于2
2.2 单精度浮点数
对于32位的单精度浮点数而言,内存中32个bit位是这样分配的:
- 1位符号位
- 8位指数位
- 23位小数位
2.3 双精度浮点数
对于64位的双精度浮点数而言,内存中64个bit位是这样分配的:
- 1位符号位
- 11位指数位
- 52位小数位
2.4 指数偏差(Biased Exponent)
2.4.1指数E不为全0或全1
对于float型,我们发现8位的E如果就表示8个无符号的二进制位,那么指数位2^E只能表示比1大的数,而不能表示0-1之间的数,这就导致负指数没法被表示出来。
为了表示负指数,规定E在内存中的值等于你想要真实表达的指数的值再加上中间数127(对于double型,这个中间数是1023),所以即使你想使用负指数,加上1