我的程序当前通过从存储 double 值的内存中读取来打印十六进制转储。
它给了我
00 00 00 00 00 50 6D 40
我如何理解这一点并获得我存储的值,即 234.5?
我知道double有64位,第一位是符号位,接下来的11位是指数,最后52位是尾数
(-1)^sign * (1.mantissa) * 2^(指数 - 1023)
但是,我已经尝试了 double 的 little endian 和 big endian 表示,但我似乎无法让它工作。
最佳答案
首先要认识到的是,大多数现代处理器都使用小端表示法。这意味着最后一个字节实际上是最重要的。因此,作为单个十六进制常量的值是 0x406d500000000000
。
符号位是0
。接下来的 11 位是 0x406
。接下来的 52 个是 0xd500000000000
。
(-1)^sign
是 1
。 2^(exponent - 1023)
是 128
。这些很简单。
1.mantissa
很难评估,除非您了解它的真正含义。它是常量 1.0
后跟作为分数的 52 位尾数。要将整数转换为分数,您需要将其除以 2^52 的表示形式。 0xd500000000000/(2**52)
是 0.83203125
。
将它们放在一起:1 * (1.0 + 0.83203125) * 128
是 234.5
。
关于c++ - 将十六进制转储转换为 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23025737/