我试图从计算机的内存中提取double的字节值。这样做的原因是准确性,因为表示给用户的最终值执行了一些舍入。
理想情况下,我希望能够从数字(IEEE 754标准)中提取符号,指数和尾数
根据我的理解,转换为无符号字符是可行的方法。我有以下代码片段(在其他地方被盗),但我不相信结果 - 任何整数值都没有字节输出:
double d = 2;
unsigned char *p = (unsigned char*)&d;
任何人都可以指导我正确的方向,以准确提取双数字的字节表示,或提供有关如何进行的任何建议/意见吗?
答案 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+1
。 0x
之后的数字是尾数,在1和2之间归一化,以十六进制表示。 p
之后的数字是指数。它以十进制显示,但代表2的幂。