数据类型:浮点数,C中的长转换

时间:2013-04-10 18:50:34

标签: c floating-point ieee-754 type-conversion

我正在阅读C primer plus,在第3章中,数据类型,作者说:

如果采用表示浮点数256.0的位模式并将其解释为long值,则得到113246208。

我不明白转换是如何运作的。有人可以帮助我吗?谢谢。

3 个答案:

答案 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

所以没有“转换”,但有不同的解释。