使用%x打印十六进制值时,为什么为';ffffff';在每个值之后打印? 在C++代码中,我将打开一个文件并打印每个字符 文件只有16个字符,但为什么ffffff会在每个heax值之后打印 char buff[256]; // buff filled with fread for(i=0;i<16;i++) printf("%x",buff[i]);

使用%x打印十六进制值时,为什么为';ffffff';在每个值之后打印? 在C++代码中,我将打开一个文件并打印每个字符 文件只有16个字符,但为什么ffffff会在每个heax值之后打印 char buff[256]; // buff filled with fread for(i=0;i<16;i++) printf("%x",buff[i]);,c++,C++,为什么会这样?编辑: printf("%x", (int)(*(unsigned char*)(&buff[i])) ); printf(“%x”,(int)(*(无符号字符*)(&buff[i])); 这应该会成功。对不起,我的第一个版本不正确。问题在于符号位:超过127的每个值都被处理为负值。转换为无符号字符应该可以解决这个问题 printf("%x", (unsigned int)(unsigned char)buff[i]); 说明: printf将首先为您将字符转换为int。如果您

为什么会这样?

编辑:

printf("%x", (int)(*(unsigned char*)(&buff[i])) ); printf(“%x”,(int)(*(无符号字符*)(&buff[i])); 这应该会成功。对不起,我的第一个版本不正确。问题在于符号位:超过127的每个值都被处理为负值。转换为无符号字符应该可以解决这个问题

printf("%x", (unsigned int)(unsigned char)buff[i]);
说明:


printf
将首先为您将字符转换为int。如果您的字符是有符号的(第一位是1),例如
10000001
,则符号扩展将在转换为int时保留该值:
11111111111111 10000001
。解决方法是首先自己转换(不带符号扩展)。

向我们展示完整的代码,特别是
buff
是什么以及它是如何填充数据的。出于对培根的热爱,请不要添加不适用于您的问题的标签。您声明它是C++代码(虽然我认为它是真正的C代码),但是您添加了其他语言…不要这样做。请给有效的C代码贴上这样的标签,并且只贴上这样的标签。浏览网站的其他人可能会认为这是好的/普通的/规范的/等等的C++代码。参见[Tyr](1)[ 1 ]:请参见此线程感谢您的快速回复。但在添加(int)及其打印FFFFFF后,请显示buff变量定义。buff由fread()提交,谢谢Alex,printf(“%x”,(int)((未签名字符)(&buff[i]));解决了我的问题。外部强制转换应该是
无符号int
,而不是
int
。这并不能提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。-真的。。。补充说明
printf("%x", (unsigned int)(unsigned char)buff[i]);