大家好,我写了以下代码:
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
。
答案 0 :(得分:3)
%x
将其参数解释为 unsigned int
。传递到可变参数函数的整数总是提升为int
,因此您签名的char
值将使用符号扩展名提升为已签名的int
,然后通过{解释为unsigned int
{1}}。
您可以通过转换为%x
或unsigned char
来解决此问题。
答案 1 :(得分:0)
意外FFFFFFFF
来自将char
转换为int
来自签名扩展名。可变参数,即printf(const char * format,...)中format参数之后的参数,将转换为int
(如果是较小的整数类型)或double
(如果是浮点数)
推荐:
使用修饰符c
,而不是使用未修改的格式说明符test.a
打印%x
或int
的数值(用于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;“