打印浮点数的内部十六进制

3

我认为我可以像这样打印出一个 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

有人能帮我理解为什么这不起作用以及我需要做什么才能使其起作用吗?


1
我猜你看到的奇怪值是 foo 的 _address_,而不是 foo 的值。请检查调试器输出。 - Netch
2个回答

5
浮点数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。这意味着你的输出是正确的(假设是小端格式)。你在调试器中读取它的方式是错误的。

5

你差不多做到了。我不确定调试器显示的是什么,但它不是你的浮点数。也许它是它的地址?

实际的浮点值是0x41500000。您可以在此处检查:IEEE-754 浮点数转换器。 如果链接无法使用,则必须自行查找在线浮点数分析器/描述。

你的方法是正确的,但你忘记了 Intel x86 CPU(我假设你的 CPU 是 Intel x86)是 小端字节序。这意味着高位字节的存储地址较低。因此,你应该按与打印相反的顺序打印字节,像这样:

printf("0x%02hhX%02hhX%02hhX%02hhX\n", bar[3], bar[2], bar[1], bar[0]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接