0

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

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

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

4

2 回答 2

4

%x将其参数解释为unsigned int. 传递给可变参数函数的整数总是被提升为int,因此您的char有符号值被提升为int使用符号扩展的有符号 s,然后解释为unsigned intby %x

unsigned char您可以通过转换为or来解决此问题uint8_t

于 2013-08-24T02:55:15.757 回答
0

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

推荐:

c而不是打印或test.a使用未修改的格式说明符的数值%x,(意味着int)使用修饰符hh

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

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


Ref C11 7.21.6.1 7 "hh 指定后面的 d、i、o、u、x 或 X 转换说明符适用于有符号字符或无符号字符参数(该参数将根据整数提升进行提升,但其值应在打印前转换为有符号字符或无符号字符);"

于 2013-08-24T03:43:48.280 回答