1

这是一个代码片段:

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

?

有人可以分析一下吗?

4

2 回答 2

6

您正在打印%d用于有符号数字的值。该值被“转换”为有符号数(它实际上按位保持不变,但第一位的解释不同)。

至于 unsigned char 和 short - 它们也被转换为 32 位 int,所以值适合它。

如果您使用%lld(并将值转换为long long,否则可能是未指定的行为),即使最后两个数字也可能打印为无符号。

无论如何,用于%u无符号数字。

它是如何工作的?

位值 255 是11111111. 如果将其视为无符号数,它将是 255。如果将其视为有符号数 - 它将是 -1(第一位通常确定符号)。当您将值传递给%dprintf 时,该值将转换为 32 位整数,如下所示00000000000000000000000011111111:由于第一位是 0,因此该值仅打印为 255。它对您的short.

32 位整数的情况有所不同。它立即被分配一个11111111111111111111111111111111值,该值代表单数表示法中的 -1。并且由于您%d在 printf 中使用过,它被解释为-1.

于 2013-11-14T16:16:58.447 回答
0

基本上,您不应将负值分配给“无符号”变量。你试图在编译器上玩花样,谁知道它会做什么。现在,“char n = -1;” 没关系,因为“n”可以合法地采用负值,并且编译器知道如何处理它。

于 2013-11-14T16:34:46.760 回答