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