使用%x打印十六进制值时,为什么在每个值后打印'ffffff'?

时间:2011-09-21 08:22:03

标签: c++

在示例c ++代码中,我将打开一个文件并以hexa打印每个char 文件只有16个字符,但为什么ffffff会在每个heax值后打印?

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

输出是:

4affffff67ffffffcdffffff

为什么会这样?

2 个答案:

答案 0 :(得分:12)

编辑:

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

这应该成功。我的第一个版本不对,抱歉。问题在于符号位:每个超过127的值都被视为负数。转换为unsigned char应该可以解决问题。

答案 1 :(得分:0)

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

说明:

printf将首先将char转换为int。如果您的字符已签名(第一位为1) - 例如10000001 - 然后签名扩展名将在转换为int:11111111 11111111 11111111 10000001时保留该值。修复是首先自己转换它(没有符号扩展名)。