【问题标题】:When printing hex values using %x why is 'ffffff' printed after each value? [duplicate]使用 %x 打印十六进制值时,为什么在每个值之后打印 'ffffff'? [复制]
【发布时间】:2011-11-21 17:42:39
【问题描述】:

在示例 C++ 代码中,我将打开一个文件并以十六进制打印每个字符 文件只有 16 个字符,但为什么 ffffff 会在每个十六进制值之后打印?

char buff[256];
// buff filled with fread
for(i=0;i<16;i++)
printf("%x",buff[i]);

输出是:

4affffff67ffffffcdffffff

这是为什么?

【问题讨论】:

  • 向我们展示完整的代码,具体来说,buff 是什么以及它是如何填充数据的。
  • 出于对培根的喜爱,不要添加不适用于您的问题的标签。你说它是 C++ 代码(虽然我认为它真的是 C 代码)但是你添加了其他语言......不要那样做。
  • 请将有效的 C 代码标记为此类,并且仅标记为此类。其他浏览该网站的人可能会认为这是好的/常见的/规范的/等等。 C++ 代码。

标签: c++


【解决方案1】:

编辑:

printf("%x", (int)(*(unsigned char*)(&buff[i])) );

这应该可以解决问题。我的第一个版本不正确,对不起。问题在于符号位:每个大于 127 的值都被视为负数。转换为 unsigned char 应该可以解决问题。

【讨论】:

  • 感谢您的快速回复。但是在添加 (int) 之后,它的打印也是 ffffff
  • 请显示buff变量定义。
  • buff 由 fread() 归档
  • 谢谢 Alex, printf("%x", (int)((unsigned char)(&buff[i])) );解决了我的问题。
  • 外部演员应该是unsigned int,而不是int
【解决方案2】:
printf("%x", (unsigned int)(unsigned char)buff[i]);

解释:

printf 将首先为您将 char 转换为 int。如果您的 char 已签名(第一位为 1) - 例如10000001 - 然后符号扩展将在转换为 int 时保留该值:11111111 11111111 11111111 10000001。解决方法是先自己转换(不带符号扩展)。

【讨论】:

  • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
  • true ... 已添加说明
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 2011-11-16
  • 1970-01-01
  • 2011-04-03
  • 2017-01-23
  • 2016-11-27
相关资源
最近更新 更多