【问题标题】:Converting Hex Dump to Double将十六进制转储转换为双精度
【发布时间】:2014-04-12 03:28:21
【问题描述】:

我的程序当前通过从存储双精度的内存中读取来打印十六进制转储。

它给了我

00 00 00 00 00 50 6D 40

我如何理解这一点并获得我存储的值,即 234.5?

我知道双精度有 64 位,第一位是符号位,接下来的 11 位是指数,最后 52 位是尾数

(-1)^sign * (1.mantissa) * 2^(exponent - 1023)

但是,我已经尝试过双精度的小端和大端表示,但我似乎无法使其工作。

【问题讨论】:

  • 注意:如果偏置指数为0,则公式变为(-1)^sign * (0.mantissa) * 2^(1 - 1023)

标签: c++ c hex


【解决方案1】:

首先要意识到的是,大多数现代处理器都使用小端表示法。这意味着最后一个字节实际上是最重要的。所以你作为单个十六进制常量的值是0x406d500000000000

符号位是0。接下来的 11 位是0x406。接下来的 52 个是0xd500000000000

(-1)^sign12^(exponent - 1023)128。这些很简单。

1.mantissa 很难评估,除非您意识到它的真正含义。它是常量1.0,后跟 52 位尾数作为分数。要将整数转换为分数,您需要将其除以 2^52 的表示。 0xd500000000000/(2**52)0.83203125

把它们放在一起:1 * (1.0 + 0.83203125) * 128234.5

【讨论】:

    【解决方案2】:

    This online calculator可以为你做。

    如果你是大端,请输入

    00 00 00 00 00 50 6D 40 
    

    或者如果你是小字节序

    40 6D 50 00 00 00 00 00
    

    第一个是奇数,第二个是234.5

    【讨论】:

    • 好的,使用这个计算器我们看到指数是 1030
    • 1030 - 1023 是 7,我们得到 2^7 作为等式的第二部分......但是当我们将 234.5 除以 2^7 时,我们得到一个长数,不等于显示的尾数计算机。我不知道如何正确获取尾数
    猜你喜欢
    • 1970-01-01
    • 2014-05-05
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 2019-08-13
    相关资源
    最近更新 更多