1 简介
众所周知,计算机只认识二进制码,同样任何东西在计算机中都是以二进制存储的,整形的存储方式我们都已经知道,那么float型是怎么存储的呢?接下来将以float a = 0.5为例:
根据标准IEEE 754,32位的float的格式为:
2 表示方法
2.1 符号位
毋庸置疑,0.5为正数,所以1bit的符号位为0b0.
2.2 指数位
将0.5转为二进制为0.1b=1x2^(-1), 那么-1在指数中该怎么表示呢?
这时候IEEE 754又规定了,为了让8bits的指数位可以表示负数,规定了一个指数偏移:假定指数位有e个bit,那么偏移为offset=2^(e-1)-1。则转化为IEEE 754时指数位的大小(编码值)为实际值加上这个偏移offset.
对于32bit的float而言,e=8,所以此处编码值为2^(8-1)-1=127.
所以float型0.5根据IEEE 754存储时的指数大小为-1 + 127=126=0b01111110.
2.3 有效数位
有效数该怎么表示呢?
IEEE 754规定:
(1)如果浮点数中指数部分的编码值属于(0, 2^e-2],且在科学表示法的表示方式下,有效数位 (fraction) 部分最高有效位(即整数位)是1,那么这个浮点数将被视为规约形式的浮点数,该表示方法下有一位隐含的二进制有效数字。
(2)如果浮点数的指数部分的编码值是0,有效数部分非零,那么这个浮点数将被称为非规约形式的浮点数。一般是某个数字相当接近零时才会使用非规约型式來表示。 IEEE 754标准规定:非规约形式的浮点数的指数偏移值比规约形式的浮点数的指数偏移值小1。
由于此处编码值为127,属于规约形式,所以隐含有一位二进制有效数字1,所以有效数位全为0.
所以最后float型0.5在计算机中将会表示为0b0 01111110 00000000000000000000000.