这是一个代码片段:
unsigned short a=-1;
unsigned char b=-1;
char c=-1;
unsigned int x=-1;
printf("%d %d %d %d",a,b,c,x);
为什么输出是这样的:
65535 255 -1 -1
?
有人可以分析一下吗?
您正在打印%d
用于有符号数字的值。该值被“转换”为有符号数(它实际上按位保持不变,但第一位的解释不同)。
至于 unsigned char 和 short - 它们也被转换为 32 位 int,所以值适合它。
如果您使用%lld
(并将值转换为long long
,否则可能是未指定的行为),即使最后两个数字也可能打印为无符号。
无论如何,用于%u
无符号数字。
位值 255 是11111111
. 如果将其视为无符号数,它将是 255。如果将其视为有符号数 - 它将是 -1(第一位通常确定符号)。当您将值传递给%d
printf 时,该值将转换为 32 位整数,如下所示00000000000000000000000011111111
:由于第一位是 0,因此该值仅打印为 255。它对您的short
.
32 位整数的情况有所不同。它立即被分配一个11111111111111111111111111111111
值,该值代表单数表示法中的 -1。并且由于您%d
在 printf 中使用过,它被解释为-1
.
基本上,您不应将负值分配给“无符号”变量。你试图在编译器上玩花样,谁知道它会做什么。现在,“char n = -1;” 没关系,因为“n”可以合法地采用负值,并且编译器知道如何处理它。