1、对于数字 80.125,怎么将其转换成二进制呢?
对于整数部分 80 转换成二进制,就是 1010000
而对于小数部分 0.125,可以看下面的图( 一直乘 2 ,遇到 1 退出。如果乘 2 之后的数字大于 1,则减去 1 )
所以 0.125 转换成小数就是 0.001
所以 80.125 转换成的二进制数就是1010000.001
2、对于数字 12.2,怎么将其转换成二进制呢?
对于整数部分 12 转换成二进制,就是 1100
而对于小数部分 0.2 ,可以看下面的图( 一直乘 2 ,遇到 1 退出。如果乘 2 之后的数字大于 1,则减去 1 )
所以 0.2 转换成小数就是 0.0011001100110011...( 0011 无限循环,因为不管乘多少次 2 都不可能遇到 1 )
所以 12.2 转换成的二进制数就是1100.00110011001100110011...
好,看懂了上面的两张图,基本上就明白小数怎么转换成二进制数了
先看一下 float 的存储结构,如下图所示
1、假设有个浮点数 -12.75 ,我们把它转换成二进制
因为它是负数,所以符号位就是 1 (相反,正数的话符号位就是 0 )
我们先将 12.75(忽略负号)转换成二进制小数 1100.11 (这里不明白怎么转换的,再去看看上面两张图)
然后再将这个二进制小数转换成科学计数法 1.10011 * ,这时候我们就得到了尾数部分,为小数部分 10011,后面补 0,占满23位,即 10011000000000000000000
最后,我们只差指数位没有填进去了,理所当然的,指数位就是要把 的指数 3 填进去,怎么填进去呢(注意:指数也有可能是负数)
填进去的方法就是 加上127 然后 转 2 进制 再填进去,具体就是 3 + 127 = 130 => 10000010
所以最终得到的就是
2、接下来我再来讲个特殊情况,假如浮点数 0.2 怎么转化成二进制
首先将其转化成二进制小数 0.0011001100110011......( 小数部分 0011 无限循环 )
然后再转化成科学计数法 1.100110011001100110011... *
因为数字是正数,所以符号位是 0
指数位是 的指数 -3 加上127 然后 转 2 进制,即 -3 + 127 = 124 => 01111100
尾数部分是 10011001100110011001100 ( 这里本应该是 1 0011 0011 0011 无限循环,但由于尾数部分只有 23 位,所以超出部分直接截去,这也是有时候浮点数不精确的原因 )
所以最终得到的就是