我正在阅读 C primer plus,在第 3 章,数据类型中,作者说:
如果您采用表示 float 256.0 的位模式并将其解释为长整型值,您将得到 113246208。
我不明白转换是如何进行的。有人可以帮我吗?谢谢。
最佳答案
256.0 是 1.0*28,对吗?
现在,看看格式(从@bash.d 窃取):
31 0
| |
SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM //S - SIGN , E - EXPONENT, M - MANTISSA
数字是正数,所以 0
进入 S
。
指数 8
进入 EEEEEEEE
但在到达那里之前,您需要根据格式要求向其加 127
,所以 135
到那里。
现在,在 1.0
中,只有点右边的内容实际存储在 MMMMMMMMMMMMMMMMMMMMMMMM
中,所以 0 就在那里。 1.
隐含在格式中表示的大多数数字中,实际上并未存储在格式中。
这里的思路是所有非零数的绝对值都可以转化为
1.0...1.111(1) * 10一些整数(所有数字都是二进制的)
或几乎等价
1.0...1.999(9) * 2一些整数(所有数字均为十进制)
这就是我在回答顶部所做的。转换是通过重复将数字除以或乘以 2 来完成的,直到得到十进制范围 [1.0, 2.0)(或二进制 [1.0, 10.0) 中的尾数)。既然非零数中总有这个1,那为什么还要存储呢?因此它不会被存储并为您提供另一个免费的 M
位。
所以你最终得到:
(0 << 31) + ((8 + 127) << 23) + 0 = 1132462080
格式描述here .
关于c - 数据类型 : float, 在 C 中的长转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15934018/