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

是整数常量的默认类型是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 

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

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

对于hex,它是值可以适合的第一种类型: intunsigned intlongunsigned longlong longunsigned long long

例如,在具有32-bit intunsigned int0x80000000unsigned int

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

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

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

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

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


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