打印出浮子的内六角

时间:2018-04-26 13:02:15

标签: c++ floating-point hex printf 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]);

输出:

  

0x00005041

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

  

0x003EF830

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

2 个答案:

答案 0 :(得分: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

这意味着您的输出正确(假设采用小端格式)

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

答案 1 :(得分:5)

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

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

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

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