嗨,我目前正在学习C,有些事情我还是不太了解。首先,我被告知如果我这样做:
unsigned int c2 = -1;
printf("c2 = %u\n", c2);
但是我得到一个奇怪的结果:c2 = 4294967295
现在奇怪的是,这有效:
unsigned char c2 = -1;
printf("c2 = %d\n", c2);
但是我不明白,因为既然char是一个char,为什么它甚至还能打印任何内容?由于此处的说明符是“%d”,而不是“%u”,因为它应用于无符号类型。
在此声明中
unsigned char c2 = -1;
-1的内部表示形式被截断并解释为无符号字符。即,对象c2的所有位被设置。
在此通话中
printf("c2 = %d\n", c2);
具有无符号字符类型的参数被提升为类型int
,并保留其值为255。此值作为整数输出。
以下代码:
unsigned int c2 = -1;
printf("c2 = %u\n", c2);
出于以下两个原因,永远不会打印255
:
int
必须至少为16位。因此,如果您使用%d
,则您将要设置的值很可能会是一个更高的负数。%u
永远不会输出负值,因为它需要一个无符号的整数并将所传递的变量解释为无符号的。如果要将c2
解释为signed整数,则必须改用%d
。获得255
作为输出的正确代码是:
unsigned char c = -1;
printf("c = %hhd\n", c);
hh
前缀说明符的意思(来自man 3 printf
):
hh:以下整数转换对应于
signed char
或unsigned char
自变量,或以下n
转换sion对应于指向signed char
参数的指针。