打印出浮点数的内部十六进制
Printing out the Internal Hex of a float
所以我认为我可以像这样打印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
这意味着您的输出是正确的(假设有点字节序格式)
在调试器中读取它的方式不正确
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 通过错误处理,在C++中可靠地获得用户十六进制输入
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 指向存储在字符串 c++ 中的十六进制
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- C ++如何使用UTF8十六进制代码打印UTF8符号?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 如何在C++中将十六进制字符串转换为文本数据
- 使用 sprintf 将十六进制0xAABBCC转换为字符串"AA:BB:CC"
- 绝对编码器十六进制输入
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- C++17 十六进制浮点文字单精度后缀冲突?
- 是否可以在C++中获取 CHAR 的有效十六进制地址?
- 打印十六进制字符
- 打印出浮点数的内部十六进制