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

Vic*_*r S 22 c

是整数常量的默认类型是signed还是unsigned?如0x80000000,我怎样才能决定使用它作为有符号整数常量还是无任何后缀的无符号整数常量?

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

printf("0x80000000>>3 : %x\n", 0x80000000>>3);
Run Code Online (Sandbox Code Playgroud)

输出:

0x80000000>>3 : 10000000
Run Code Online (Sandbox Code Playgroud)

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

int n = 0x80000000;

printf("n>>3: %x\n", n>>3);
Run Code Online (Sandbox Code Playgroud)

输出:

n>>3: f0000000
Run Code Online (Sandbox Code Playgroud)

oua*_*uah 25

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

对于小数,它是该值可以配合在第一类型:int,long,long long

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

例如用在系统上32-bit intunsigned int:0x80000000unsigned int.

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

  • @mbonnin一些编译器*可以*显示警告,但标准不需要警告.任何算术类型与任何算术类型之间都存在隐式转换. (2认同)

Gra*_*and 9

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

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

unsigned int i = 1234u; // no conversion needed
unsigned int i = 1234;  // signed value 1234 now converted to unsigned
Run Code Online (Sandbox Code Playgroud)

因为0x80000000,如果你的平台上的int是32位,那么它将是无符号的,因为它不适合带符号的int.


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

  • 始终对十进制整数常量进行签名.对于十六进制常量,它可以适合"long"但如果它适合于`unsigned int`,它将是`unsigned int`.有符号整数不是签名`int`的同义词.类型`long`也是有符号整数类型. (3认同)