从内存中提取double的字节值

时间:2012-01-07 17:57:05

标签: c++ double byte

我试图从计算机的内存中提取double的字节值。这样做的原因是准确性,因为表示给用户的最终值执行了一些舍入。

理想情况下,我希望能够从数字(IEEE 754标准)中提取符号,指数和尾数

根据我的理解,转换为无符号字符是可行的方法。我有以下代码片段(在其他地方被盗),但我不相信结果 - 任何整数值都没有字节输出:

double d = 2;
unsigned char *p = (unsigned char*)&d;

任何人都可以指导我正确的方向,以准确提取双数字的字节表示,或提供有关如何进行的任何建议/意见吗?

2 个答案:

答案 0 :(得分:5)

你做得对。您现在可以将p视为数组unsigned char[sizeof(double)]

例如:

for (int i = 0; i != sizeof(double); ++i)  printf("%02X ", p[i]);

对于d = 0.125,这会打印00 00 00 00 00 00 C0 3F。反转字节顺序并分解成部分,这是:

00111111 11000000 0 0 0 0 0 0
   3F       C0    0 0 0 0 0 0

0   01111111100   0...<52 times>...0
S     Exponent         Mantissa
+     1023 - 3           1.0

指数字段的值为1020,在通过偏差1023校正后给出指数-3,尾数为1.0,包括隐式前导1.因此值为2 -3 = 1/8。

答案 1 :(得分:3)

如果您的动机只是准确,请使用printf("%a\n", d);

它显示与转到二进制表示形式相同的信息,但它以几乎人类可读的格式显示。在这里(即d=2;),它显示0x1p+10x之后的数字是尾数,在1和2之间归一化,以十六进制表示。 p之后的数字是指数。它以十进制显示,但代表2的幂。