打印出一个字母时出现奇怪的“f”字样

时间:2013-08-24 02:50:13

标签: c printf

大家好,我写了以下代码:

union endian {
    char a;
    int  b;
} test;
char c;

test.b = 0xaabbccdd;
c =  (char)test.a;
printf("0x%x\n", c);
printf("0x%x\n", test.b);
printf("0x%x\n", test.a);
printf("0x%x\n", (char)test.a);

但输出是:

0xffffffdd
0xaabbccdd
0xffffffdd
0xffffffdd

我想知道为什么在char变量之前有一些前导0xffffff

2 个答案:

答案 0 :(得分:3)

%x将其参数解释为 unsigned int 。传递到可变参数函数的整数总是提升为int,因此您签名的char值将使用符号扩展名提升为已签名的int,然后通过{解释为unsigned int {1}}。

您可以通过转换为%xunsigned char来解决此问题。

答案 1 :(得分:0)

意外FFFFFFFF来自将char转换为int来自签名扩展名。可变参数,即printf(const char * format,...)中format参数之后的参数,将转换为int(如果是较小的整数类型)或double(如果是浮点数)

推荐:

使用修饰符c,而不是使用未修改的格式说明符test.a打印%xint的数值(用于hh)。

printf("0x%hhx\n", c);

这将在0x之后打印出2个十六进制数字。


参考C11 7.21.6.1 7“hh指定以下d,i,o,u,x或X转换说明符适用于signed char或unsigned char参数(该参数将根据整数提升进行提升) ,但在打印之前,其值应转换为signed char或unsigned char;“