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

Printing out the Internal Hex of a float

本文关键字:内部 十六进制 浮点数 打印      更新时间:2023-10-16

所以我认为我可以像这样打印float的内部十六进制:

const auto foo = 13.0F;
const auto bar = reinterpret_cast<const unsigned char*>(&foo);
printf("0x%02hhX%02hhX%02hhX%02hhXn", bar[0], bar[1], bar[2], bar[3]);

这输出:

0x00005041

但是当我查看调试器时,它为foo报告的十六进制是:

0x003EF830

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

你几乎明白了。我不确定调试器显示的内容,但它不是您的浮点数。也许是它的地址?

实际浮点值为0x41500000。您可以在此处查看: IEEE-754 浮点转换器. 如果链接不起作用,则必须自己找到在线浮点分析器/描述。

你以正确的方式做了,但你忘记了英特尔 x86 CPU(我想你的 CPU 是英特尔 x86)是小端序。这意味着更高重要性的字节位于更高的内存地址上。因此,您应该以与打印它们相反的顺序打印出字节,如下所示:

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

浮点值 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

这意味着您的输出是正确的(假设有点字节序格式)

在调试器中读取它的方式不正确