打印出浮点数的内六角
Printing out the Internal Hex of a float
所以我想我可以像这样打印 float
的内部十六进制:
const auto foo = 13.0F;
const auto bar = reinterpret_cast<const unsigned char*>(&foo);
printf("0x%02hhX%02hhX%02hhX%02hhX\n", bar[0], bar[1], bar[2], bar[3]);
这输出:
0x00005041
但是当我查看调试器时,它为 foo
报告的十六进制是:
0x003EF830
有人可以帮助我理解为什么这不起作用以及我需要做什么才能让它起作用吗?
浮点值 13.0f 的十六进制值为:
0x41500000
确认:
取二进制的0x41500000
:
0100,0001,0101,0000,0000,0000,0000,0000
分为1位符号,8位指数和23位尾数为:
0 : 10000010 : 10100000000000000000000
我们可以使用标准浮动评估来解释这一点:
-1^s x 1.<mantissa> x 2^(exponent-127)
作为
(-1)^0 x 1.101 x 2^(10000010-1111111)
也就是
1.101b x (10b)^11b
也就是
1.625 x 8
也就是
13.0f
这意味着你的输出是正确的(假设是小端格式)
您在调试器中读取它的方式不正确
你差不多明白了。我不确定调试器显示的是什么,但它不是你的浮点数。也许是它的地址?
实际浮点值是0x41500000
。您可以在这里查看:IEEE-754 Floating Point Converter。
如果link不行你就得自己去网上找浮点数analyzer/description
你做对了,但你忘记了 Intel x86 CPUs(我想你的 CPU 是 Intel x86)是 little endian .这意味着更高的重要性字节位于更高的内存地址上。所以你应该以相反的顺序打印字节,就像这样:
printf("0x%02hhX%02hhX%02hhX%02hhX\n", bar[3], bar[2], bar[1], bar[0]);
所以我想我可以像这样打印 float
的内部十六进制:
const auto foo = 13.0F;
const auto bar = reinterpret_cast<const unsigned char*>(&foo);
printf("0x%02hhX%02hhX%02hhX%02hhX\n", bar[0], bar[1], bar[2], bar[3]);
这输出:
0x00005041
但是当我查看调试器时,它为 foo
报告的十六进制是:
0x003EF830
有人可以帮助我理解为什么这不起作用以及我需要做什么才能让它起作用吗?
浮点值 13.0f 的十六进制值为:
0x41500000
确认:
取二进制的0x41500000
:
0100,0001,0101,0000,0000,0000,0000,0000
分为1位符号,8位指数和23位尾数为:
0 : 10000010 : 10100000000000000000000
我们可以使用标准浮动评估来解释这一点:
-1^s x 1.<mantissa> x 2^(exponent-127)
作为
(-1)^0 x 1.101 x 2^(10000010-1111111)
也就是
1.101b x (10b)^11b
也就是
1.625 x 8
也就是
13.0f
这意味着你的输出是正确的(假设是小端格式)
您在调试器中读取它的方式不正确
你差不多明白了。我不确定调试器显示的是什么,但它不是你的浮点数。也许是它的地址?
实际浮点值是0x41500000
。您可以在这里查看:IEEE-754 Floating Point Converter。
如果link不行你就得自己去网上找浮点数analyzer/description
你做对了,但你忘记了 Intel x86 CPUs(我想你的 CPU 是 Intel x86)是 little endian .这意味着更高的重要性字节位于更高的内存地址上。所以你应该以相反的顺序打印字节,就像这样:
printf("0x%02hhX%02hhX%02hhX%02hhX\n", bar[3], bar[2], bar[1], bar[0]);