float浮点数的二进制存储方式图解

首先先讲怎么将小数转换成二进制数字(两个实例)

1、对于数字 80.125,怎么将其转换成二进制呢?

对于整数部分 80 转换成二进制,就是 1010000

而对于小数部分 0.125,可以看下面的图( 一直乘 2 ,遇到 1 退出。如果乘 2 之后的数字大于 1,则减去 1 )
float浮点数的二进制存储方式图解
所以 0.125 转换成小数就是 0.001

所以 80.125 转换成的二进制数就是1010000.001

2、对于数字 12.2,怎么将其转换成二进制呢?

对于整数部分 12 转换成二进制,就是 1100

而对于小数部分 0.2 ,可以看下面的图( 一直乘 2 ,遇到 1 退出。如果乘 2 之后的数字大于 1,则减去 1 )
float浮点数的二进制存储方式图解
所以 0.2 转换成小数就是 0.0011001100110011…( 0011 无限循环,因为不管乘多少次 2 都不可能遇到 1 )

所以 12.2 转换成的二进制数就是1100.00110011001100110011…

接下来讲怎么将浮点数转换成二进制存储(两个实例)

先看一下 float 的存储结构,如下图所示

float浮点数的二进制存储方式图解
1、假设有个浮点数 -12.75 ,我们把它转换成二进制

因为它是负数,所以符号位就是 1 (相反,正数的话符号位就是 0 )

我们先将 12.75(忽略负号)转换成二进制小数 1100.11 (这里不明白怎么转换的,再去看看上面两张图)

然后再将这个二进制小数转换成科学计数法 1.10011 * ,这时候我们就得到了尾数部分,为小数部分 10011,后面补 0,占满23位,即 10011000000000000000000

最后,我们只差指数位没有填进去了,理所当然的,指数位就是要把 的指数 3 填进去,怎么填进去呢(注意:指数也有可能是负数)

填进去的方法就是 加上127 然后 转 2 进制 再填进去,具体就是 3 + 127 = 130 => 10000010

float浮点数的二进制存储方式图解
2、接下来我再来讲个特殊情况,假如浮点数 0.2 怎么转化成二进制

首先将其转化成二进制小数 0.0011001100110011…( 小数部分 0011 无限循环 )

然后再转化成科学计数法 1.100110011001100110011… *

因为数字是正数,所以符号位是 0

指数位是 ​​​​​​​​​​​​​​ 的指数 -3 加上127 然后 转 2 进制,即 -3 + 127 = 124 => 01111100

尾数部分是 10011001100110011001100 ( 这里本应该是 1 0011 0011 0011 无限循环,但由于尾数部分只有 23 位,所以超出部分直接截去,这也是有时候浮点数不精确的原因 )

所以最终得到的就是
float浮点数的二进制存储方式图解
原文链接:https://blog.csdn.net/cry_shoulder/article/details/104806622