在这里,我就不解释那些ieee的术语,因为大家只要一搜索,到处都有。这里我用一个直观的实例解释float浮点数在intel机器上的存储方式,并给出计算方法,让人能一目了然的明白如何将二进制存储的浮点数的转换成我们常见的十进制形式,并解释为何有的浮点数不能被精确表示,如12.34常常被表示为12.3400001526。
对于十进制数12.34如何转换成二进制存储的浮点数,我们需要分3步走
1、先将12.34转换成二进制表示,整数和小数部分分别单独转换
整数部分是不停的除二,将余数由后向前排列
即12=1100
小数部分是不停的乘二,将乘积的整数部分由前向后排列
即0.34=0.01010111......,我们发现小数部分*2永远乘不尽,就是说不可能出现没有小数的时候,所以此浮点数就无法被精确的转换成二进制。
将整数与小数部分合并得,12.34的二进制表示即 12.34->1100.01010111......
2、将二进制数1100.01010111用科学计数法表示成:
1100.01010111->1.10001010111*(2的3次方)
此时就可以将上面的二进制位填入下表中了
32位
整个浮点数共需要32位共4个字节来表示
31位为符号位,1代表负数,0代表正数,数字0的此位同正数
23~30位共8个字节,存储的是科学计数法的指数,即二的多少次方,上例为3
0~22为共23个字节,存储的是科学计数法的小数部分,因为根据科学计数法,整数部分总为1所以存储时可省略,以便多出一位来表示
即12.34->10100100 01110000 01001010 01000001
顺序的表示就是A4 70 45 41
3、此步就是将上面的字节顺序翻转过来,变成41 45 70 A4。
为什么要翻转?
因为在intel机器中,我们内存中使用的是小头字序,就是说低字节的放到前头,哪个方向是前头?
就是我们内存表示时是这样的
0字节 1字节 2字节 3字节 4字节 5字节.......
低字节在前面
所以上面的字节在内存中的正确排序是
41 45 70 A4
跟纸上表示正好倒过来了,谁叫我们纸上表示时把高字节放到前面呢!!!