【发布时间】:2012-07-03 12:01:41
【问题描述】:
整数常量的默认类型是有符号还是无符号?比如0x80000000,我该如何决定是用它作为有符号整数常量还是无符号整数常量而不带任何后缀?
如果是有符号整数常量,下面的情况如何解释?
printf("0x80000000>>3 : %x\n", 0x80000000>>3);
输出:
0x80000000>>3 : 10000000
以下情况可以表明我的平台使用算术位移,而不是逻辑位移:
int n = 0x80000000;
printf("n>>3: %x\n", n>>3);
输出:
n>>3: f0000000
【问题讨论】:
-
通常
0x80000000是INT_MAX + 1,所以它是无符号的。因此,第一个示例中的逻辑移位。但是当您将其分配给int时,您会调用未定义的行为,并且通常结果是INT_MIN。左移负整数是实现定义的,通常使用算术移位。不同之处在于,在后者中,您将其强制为有符号类型。 -
@DanielFischer
INT_MAX + 1是 UB,但int n = 0x80000000;不是 UB,而是实现定义的,在这种情况下,整数转换由 6.3.1.3p3(在 C99 中)控制 -
@ouah
INT_MAX + 1是一个数学表达式,而不是 C。但是,将其转换为int不是未定义的行为,而是实现定义的,这是正确的。我的错。
标签: c