现代计算机中,一般都以IEEE 754标准存储浮点数,下面附上一个浮点数转换成二进制的链接。
IEEE-754 Floating Point Converter
这个标准在内存中的存储形式:(阶码和尾数之间隐含小数点)
数符 | 阶码(含阶符) | 尾数 |
sign | exponent | fraction |
float,double在内存中占用位宽如下所示:
类型 | 符号位 | 阶码 | 尾数 | 长度 |
float | 1 | 8 | 23 | 32 |
double | 1 | 11 | 52 | 64 |
下面我们通过例子来认识一下float与double在内存区的存储原理:
例:float f=2.25f
步骤一:符号位占1个bit位。此数为正数,所以符号位为0。
步骤二:指数位占8个bit位。
第一步:先将十进制的2.25转换成二进制0010.01(整数部分除二取余,小数部分乘二取整) |
第二步:将10.01用二进制的科学计数法表示为1.001 |
第三步:将第二步所得数值写成指数形式1.001*(2^1)(因为左移一位,所以是*2^1,如果左移7位,则要写成2^111的形式) |
第四步:将指数数值1+127=128,将128转化成二进制形式即1000 0000写到指数部位。这里有一点注意:float指数数值+127,double指数数值+1023 |
步骤三:尾数占 23个bit位。
只需将步骤二第二步当中所得的数1.001的小数部分001写到指数部位,剩下的用0补齐即可。
综上,单精度浮点数2.25在内存中的表示形式为:
0 1000 0000 00100000000000000000000
例:double=2.25;
略(前面部分与float=2.25相同)
第四步:将指数数值1+1023=1024,将1024转化成二进制形式即100 0000 0000写到指数位。
步骤三:尾数52个 bit位。
只需将步骤二第二步当中所得的数1.001的小数部分001写到指数部位,剩下的用0补齐即可。
综上,双精度浮点数2.25在内存中的表示形式为:
0 10000000000 0010000000000000000000000000000000000000000000000000
这里可能有个疑问:步骤二第二步小数点前面的 1去哪里了?
这是 由于尾数部分是规格化表示的,最高位总是“1”,所以这是直接隐藏掉,同时也节省了1个位出来存储小数,提高精度。