我的程序当前通过读取存储双精度值的内存来打印十六进制转储。
它给了我
<00> 00 00 00 00 00 50 6D 40我如何理解这一点并获得我存储的值,即234.5?
我意识到双位有64位,第一位是符号位,接下来的11位是指数,最后52位是尾数
( - 1)^ sign *(1.mantissa)* 2 ^(exponent - 1023)
但是,我已经尝试了双尾的小端和大端表示,我似乎无法使它工作。
答案 0 :(得分:2)
首先要意识到的是,大多数现代处理器使用的是小端表示。这意味着最后一个字节实际上是最重要的。因此,您作为单个十六进制常量的值为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
。
答案 1 :(得分:0)
This online calculator可以为您完成。
如果您处于大端,请输入
00 00 00 00 00 50 6D 40
或者如果你处于小端,
40 6D 50 00 00 00 00 00
第一个是奇怪的数字,第二个是234.5