我正在阅读C primer plus,在第3章中,数据类型,作者说:
如果采用表示浮点数256.0的位模式并将其解释为long值,则得到113246208。
我不明白转换是如何运作的。有人可以帮助我吗?谢谢。
答案 0 :(得分:3)
该引用的重要之处在于整数/ long和浮点数以不同的格式保存在内存中,这样你就不能简单地获取一些内存中有浮点数的内存并说现在它是一个int并得到一个正确的价值。
有关如何将每种数据类型保存到内存中的详细信息可以在搜索IEEE标准时找到,但同样不是报价的目标。它试图告诉你的是浮点数和整数是使用不同的模式保存的,你不能简单地使用浮点数作为int,反之亦然。
答案 1 :(得分:3)
256.0是1.0 * 2 8 ,对吧?
现在,看看格式(从@bash.d窃取它):
31 0
| |
SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM //S - SIGN , E - EXPONENT, M - MANTISSA
这个数字是正数,因此0
会进入S
。
指数8
进入EEEEEEEE
,但在它到达之前,您需要add 127
根据格式的要求,所以135
就在那里。< / p>
现在,在1.0
中,只有点右边的内容实际存储在MMMMMMMMMMMMMMMMMMMMMMM
中,所以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。
答案 2 :(得分:1)
虽然整数和长值通常使用二进制补码来表示,float
- 值具有特殊的编码,因为您不能告诉计算机仅使用位来显示浮点值。
32位浮点数包含符号位,mantisse和指数。它们共同确定float
具有的值
有关文章,请参阅here。
修改强>
所以,这就是IEEE 754编码的浮点数(32位)
31 0
| |
SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM //S - SIGN , E - EXPONENT, M - MANTISSE
我不知道256.0
的模式,但长值将纯粹解释为
31 0
| |
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB // B - BIT
所以没有“转换”,但有不同的解释。