我正在阅读 C prime plus,在第 3 章,数据类型中,作者说:
如果您采用表示浮点数 256.0 的位模式并将其解释为长值,您将得到 113246208。
我不明白转换是如何工作的。有人可以帮我吗?谢谢。
我正在阅读 C prime plus,在第 3 章,数据类型中,作者说:
如果您采用表示浮点数 256.0 的位模式并将其解释为长值,您将得到 113246208。
我不明白转换是如何工作的。有人可以帮我吗?谢谢。
该引用的重要之处在于整数/长整数和浮点数以不同的格式保存在内存中,因此您不能简单地拿起一些有浮点数的内存并说现在它是一个整数并获得正确的值.
可以在搜索 IEEE 标准中找到有关如何将每种数据类型保存到内存中的细节,但这也可能不是引用的目标。它试图告诉您的是,浮点数和整数是使用不同的模式保存的,您不能简单地将浮点数用作整数,反之亦然。
256.0 是 1.0*2 8,对吗?
现在,查看格式(从@bash.d 中窃取):
31 0
| |
SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM //S - SIGN , E - EXPONENT, M - MANTISSA
这个数字是正数,所以0
进入S
。
指数 ,8
进入EEEEEEEE
但在它进入之前,您需要add 127
按照格式的要求进入它,所以135
去那里。
现在,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
格式在此处描述。
虽然整数和长值通常使用二进制补码表示,但- 值float
具有特殊的编码,因为您不能告诉计算机仅使用位来显示浮点值。一个 32 位浮点数包含一个符号位、一个尾数和一个指数。这些共同决定了float
它的价值。
请参阅此处的文章。
编辑
所以,这就是 IEEE 754 编码的浮点数的样子(32 位)
31 0
| |
SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM //S - SIGN , E - EXPONENT, M - MANTISSE
我不知道 的模式256.0
,但 long 值将被纯粹解释为
31 0
| |
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB // B - BIT
所以没有“转换”,而是不同的解释。