出于本次讨论的目的,我们假设int 和float 都是32 位宽。我们还将假设 IEEE-754 浮动。
浮点值表示为<em>sign</em> * β<sup><em>exp</em></sup> * <em>signficand</em>。对于 32 位二进制浮点数,β 是 2,指数 exp 范围从 -126 到 127,有效位 是 归一化二进制小数,这样在小数点之前有一个前导非零位。例如25的二进制整数表示为
11001<sub>2</sub>
而25.0 的二进制浮点表示为:
1.1001<sub>2</sub> * 2<sup>4</sup> // normalized
32 位浮点数的 IEEE-754 编码是
s eeeeeeee fffffffffffffffffffffff
其中s 表示符号位,e 表示指数位,f 表示有效数(小数)位。指数使用“excess 127”表示法编码,这意味着指数值127 (01111111<sub>2</sub>) 代表0,而1 (00000001<sub>2</sub>) 代表-126 和254 (11111110<sub>2</sub> ) 代表127。有效数字的前导位未显式存储,因此25.0 将被编码为
0 10000011 10010000000000000000000 // exponent 131-127 = 4
但是,当您将 32 位 整数 值 25 的 位模式 映射到 32 位浮点格式时会发生什么?我们最终得到以下结果:
0 00000000 00000000000000000011001
事实证明,在 IEEE-754 浮点数中,指数值 00000000<sub>2</sub> 保留用于表示 0.0 和 次正规(或非正规)数字。次正规数是接近0 的数字,它不能表示为1.??? * 2<sup><em>exp</em></sup>,因为指数必须小于我们可以用8 位编码的值。这些数字被解释为0.??? * 2<sup>-126</sup>,必要时有尽可能多的前导0s。
在这种情况下,它加起来为0.00000000000000000011001<sub>2</sub> * 2<sup>-126</sup>,即为3.50325 * 10<sup>-44</sup>。
您必须映射大整数值(超过2<sup>24</sup>)才能看到除 0 以外的任何内容到一堆小数位。而且,就像 Keith 所说,无论如何,这都是未定义的行为。