26

整数常量的默认类型是有符号还是无符号?例如 0x80000000,我如何决定将其用作有符号整数常量或无符号整数常量而没有任何后缀?

如果它是一个有符号整数常量,如何解释下面的情况?

printf("0x80000000>>3 : %x\n", 0x80000000>>3);

输出:

0x80000000>>3 : 10000000

以下情况可以表明我的平台使用算术位移,而不是逻辑位移:

int n = 0x80000000;

printf("n>>3: %x\n", n>>3);

输出:

n>>3: f0000000
4

2 回答 2

28

C 对十进制、八进制和十六进制常量有不同的规则。

对于十进制,它是值可以适合的第一种类型:int, long,long long

对于十六进制,它是值可以适合的第一种类型:int, unsigned int, long, unsigned long, long long,unsigned long long

例如在具有32-bit intand的系统上是unsigned int: 。0x80000000unsigned int

请注意,对于十进制常量,C90 有不同的规则(但十六进制常量的规则没有改变)。

于 2012-07-03T12:08:14.857 回答
9

如果它适合有符号整数,则它是有符号的。要使其无符号,请附加一个u后缀,例如1234u.

您可以通过有符号值分配给无符号变量来将其转换为无符号值。

unsigned int i = 1234u; // no conversion needed
unsigned int i = 1234;  // signed value 1234 now converted to unsigned

对于0x80000000,如果 int 在您的平台上是 32 位,它将是无符号的,因为它不适合有符号的 int。


不过,要注意的另一件事是右移的行为取决于平台。在某些平台上,它是符号保留(算术),而在某些平台上,它是一个简单的按位移位(逻辑)。

于 2012-07-03T12:03:15.623 回答