是整数常量的默认类型是signed还是unsigned?

时间:2012-07-03 12:01:42

标签: c

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

如果是有符号整数常量,如何解释以下情况?

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

输出:

0x80000000>>3 : 10000000

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

int n = 0x80000000;

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

输出:

n>>3: f0000000

2 个答案:

答案 0 :(得分:23)

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

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

对于十六进制,它是值可以适合的第一种类型:intunsigned intlongunsigned longlong long,{{1 }}

例如,在unsigned long long 32-bitintunsigned int 0x80000000的系统上unsigned int

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

答案 1 :(得分:9)

如果符合有符号整数,则签名为。要使其无符号,请附加u后缀,例如1234u

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

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

对于0x80000000,如果您的平台上的整数为32位,则无符号,因为它不适合签名的int。


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