打印出浮子的内六角

Jon*_*Mee 3 c++ floating-point printf hex ieee-754

所以我认为我可以打印出这样的内部十六进制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]);
Run Code Online (Sandbox Code Playgroud)

这输出:

0x00005041

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

0x003EF830

有人可以帮助我理解为什么这不起作用以及我需要做些什么来使它工作?

Mik*_*ine 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

这意味着您的输出是正确的(假设有一点小端格式)

如何在调试器中读取它是不正确的


BJo*_*vke 5

你几乎得到了它.我不确定调试器显示的是什么,但它不是你的浮动.也许这是它的地址?

实际浮动值是0x41500000.你可以在这里查看:IEEE-754浮点转换器.如果链接不起作用,您必须自己找到在线浮点分析仪/描述.

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

printf("0x%02hhX%02hhX%02hhX%02hhX\n", bar[3], bar[2], bar[1], bar[0]);
Run Code Online (Sandbox Code Playgroud)