2011-09-21 115 views
6

在一个示例C++代码中,我将打开一个文件并在hexa中打印每个字符 文件只有16个字符,但为什么ffffff会在每个heax值后打印?使用%x打印十六进制值时,为什么在每个值后打印“ffffff”?

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

输出是:

4affffff67ffffffcdffffff 

这是为什么?

+3

向我们展示完整代码,具体来说,'buff'是什么以及它是如何填充数据的。 – orlp

+2

对于培根的爱,_PLEASE_不要添加不适用于您的问题的标签。你说它是C++代码(虽然我认为它实际上是C代码),但你添加了其他语言......不这样做。 –

+0

请标签为有效的C代码,并且只能这样。浏览网站的其他人可能会认为这是好的/常见的/规范的/等等。 C++代码。 – PlasmaHH

回答

12

编辑:

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

这应该使的伎俩。我的第一个版本不正确,对不起。问题在于符号位:每个超过127的值都被视为负值。投射到无符号字符应解决问题。

+0

感谢您的快速回复。但添加(int)后也会打印ffffff – Syedsma

+0

请显示buff变量的定义。 –

+0

char buff [256] = {0} – Syedsma

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

说明:

printf将首先将char转换为int你。如果你的char被签名(第一位是1) - 例如10000001 - 那么当转换为int:11111111 11111111 11111111 10000001时,符号扩展将保留该值。修复方法是先自己将其转换(不带符号扩展名)。

+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/11911005) –

+0

true ...解释已添加 –

相关问题