打印0x85或0x95时未定义的行为

时间:2011-06-17 02:52:46

标签: c

当我尝试使用0x150x75打印到printf("%2x")时,我看到预期的输出:

  

15
  75

但是,如果我尝试打印0x850x95,请输出0xffffff850xffffff95。这是为什么?

#include <stdio.h>

int main()
{
  char test = 0x85;
  printf("\n test hex: %2x \n", test);
  return 0;
}  

输出:

test hex: ffffff85

3 个答案:

答案 0 :(得分:8)

尝试u_char(好unsigned char,R是对的)测试;

char已为您签名并正在转换为int。如果设置了高位0x80,则它将变为负数。

答案 1 :(得分:3)

由于test是一个 signed 字符,并且0x85和0x95(实际上在0x80和0xFF之间的任何内容)都设置了高位,因此当从它升级时,结果将设置为1的signed-extended。 char to int。

尝试将test声明为unsigned char。

答案 2 :(得分:2)

作为Seth答案的一个小扩展,您正在打印一个int-wide十六进制数字。 (这就是你的格式字符串所说的)。

如果要打印字符大小的十六进制数字,可以使用:

printf("test hex: %2hhx\n", test);