## 1 问题描述
可能有时候会闲着无聊,就想要试试printf试着不同参数在不同格式下的输出结果。就在某一次无意操作中,当用%f格式输出整数1时,发现终端显示结果为0.000000,这是为什么呢?
——
## 2 解惑“1以%f格式输出时显示为0.000000”
问题已经出现了,为什么会有这么奇葩的结果呢?原因就是,浮点数与整型数的存储方式是不一样的。
### 2.1 IEEE754标准浮点数存储方式
在二进制科学表示法中,value=(-1)^S * (1.M) * 2^(E-Offset),主要由三部分构成:符号位(S) + 阶码(E) + 尾数(M)。
– 符号位(Sign):0代表正,1代表负
– 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移码形式存储。
– 尾数(Mantissa):尾数部分
| 类型 | 符号位位数 | 阶码位数 | 尾数位数 | 总位数 | 偏置值 |
|——–|—————–|———————|——————–|——–|——–|
| float | 占1位,在第31位 | 占8位,在第30~23位 | 占23位,在第22~0位 | 32 | 0x7F |
| double | 占1位,在第63位 | 占11位,在第62~52位 | 占52位,在第51~0位 | 64 | 0x3FF |
– 阶码
阶码即指数位,采用移码形式存储。简单的理解,阶码就是将数值以二进制科学表示法表示时,此时它的阶数即为阶码值。
不过,阶码值是由偏置值(Offset)加上阶码真值确定的,因为指数是有正负数的。
– 对于float类型数据,其偏置值为127,表示阶数范围为-128~127;
– 对于double类型数据,其偏置值为1023,表示阶数范围为-1024~1023.
– 尾数
有数是有效数值位,存储了数值转换为二进制科学计数法的尾数值,用原码表示。
– 移码
移码是符号位取反的补码,引入的目的是为了保证浮点数的机器零为全零。
当用补码表示阶码的时候,当阶码无限小,产生了下溢的时候,阶码变成了0,那么这个