将Hex Dump转换为Double

时间:2014-04-12 03:28:21

标签: c++ c hex

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

它给了我

<00> 00 00 00 00 00 50 6D 40

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

我意识到双位有64位,第一位是符号位,接下来的11位是指数,最后52位是尾数

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

但是,我已经尝试了双尾的小端和大端表示,我似乎无法使它工作。

2 个答案:

答案 0 :(得分:2)

首先要意识到的是,大多数现代处理器使用的是小端表示。这意味着最后一个字节实际上是最重要的。因此,您作为单个十六进制常量的值为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

答案 1 :(得分:0)

This online calculator可以为您完成。

如果您处于大端,请输入

00 00 00 00 00 50 6D 40 

或者如果你处于小端,

40 6D 50 00 00 00 00 00

第一个是奇怪的数字,第二个是234.5