【问题标题】:Printing out the Internal Hex of a float打印出浮点数的内部十六进制
【发布时间】:2018-10-07 04:41:03
【问题描述】:

所以我想我可以像这样打印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

谁能帮我理解为什么这不起作用以及我需要做些什么才能使它起作用?

【问题讨论】:

  • 我猜你看到的奇怪值是fooaddress,而不是foo 值。检查调试器输出。

标签: c++ floating-point hex printf ieee-754


【解决方案1】:

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

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

您做对了,但您忘记了 Intel x86 CPU(我想您的 CPU 是 Intel x86)是 little endian。这意味着更高的重要字节位于更高的内存地址上。因此,您应该以与打印它们相反的顺序打印出字节,如下所示:

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

【讨论】:

    【解决方案2】:

    浮点值 13.0f 的十六进制值为:

    0x41500000

    确认:

    以二进制形式的0x41500000

    0100,0001,0101,0000,0000,0000,0000,0000

    分为1位符号、8位指数和23位尾数是:

    0 : 10000010 : 10100000000000000000000

    我们可以使用标准的浮动评估来解释这一点:

    -1^s x 1.&lt;mantissa&gt; x 2^(exponent-127)

    作为

    (-1)^0 x 1.101 x 2^(10000010-1111111)

    这是

    1.101b x (10b)^11b

    这是

    1.625 x 8

    这是

    13.0f

    这意味着你的输出是正确的(假设是小端格式)

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

    【讨论】:

      猜你喜欢
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      相关资源
      最近更新 更多