【问题标题】:Why would I get 8 hex digits when I specify "%.2x"为什么我指定“%.2x”时会得到 8 个十六进制数字
【发布时间】:2019-12-05 19:06:07
【问题描述】:

我想打印浮点数的十六进制表示,但有一些fs 被意外打印。

这是我正在使用的代码:

float f = 0.2;
char *ptr = (char*)&f;
for (int i = 0; i < sizeof(float); i++)
    printf("%.2x\n", ptr[i]);

这是我得到的:

ffffffcd
ffffffcc
4c
3e

【问题讨论】:

  • 不要发布代码图片。无论如何,那是因为char 显然已在您的系统上签名。使用unsigned char
  • 另外,您代码中的%2f 与问题标题中的%.2f 不匹配。
  • @Jester 对不起,我是新手,谢谢你让我知道这里的规则。
  • @Das_Geek 感谢您的编辑,感谢大家回答我的问题。
  • @PeterCordes 你的godbolt链接只显示编译器默认设置,你可以在gcc上用-fsigned-char-funsigned-char改变它。实际上是否涉及任何二进制不兼容?

标签: c hex


【解决方案1】:

代码使用不正确的格式说明符导致未定义的行为。 %x 仅适用于 unsigned int,但您提供了 char 类型的参数。

您可以通过更改 ptr 的类型来解决此问题:

unsigned char *ptr = (char*)&f;

从技术上讲,printf 的参数应该转换为unsigned int,但通常认为依赖提升为int 的非负值是安全的,即使是%x

【讨论】:

  • 你应该可以在 printf 中进行类型转换
猜你喜欢
  • 2016-11-12
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
相关资源
最近更新 更多