为什么-2147483648在适合int时会自动提升为long?
#include int main() { printf("%zu\n", sizeof(-2147483648)); printf("%zu\n", sizeof(-2147483647-1)); return 0; }
上面的代码给出了输出(gcc):
8 4
为什么-2147483648
在第一个 printf
自动提升为long
,即使它可以适合int
?
此外,我在MinGW中尝试了同样的方法,它给出了输出:
4 4
有人可以解释一下发生了什么吗?
数字2147483648太大而无法放入int
,因此它被提升为long
。
然后,在数字已经提升为long
,计算其负数,产生-2147483648。
如果你很好奇,你可以看看limits.h
。 在我的平台上,使用glibc,
# define INT_MIN (-INT_MAX - 1) # define INT_MAX 2147483647
在MinGW上, sizeof(long) == 4
,所以升级到long
不会削减它。 根据C11标准,该值必须提升为long long
。 这不会发生,可能是因为您的MinGW编译器默认为C90或更早版本。
-2147483648
是应用了一元减运算符的积分常量表达式2147483648
。
您的系统似乎都有int
和long
为32位, long long
为64位。
由于base-10常量2147483648
不能适合long int
,因此在C99中它具有long long int
类型。 但是,C90没有这种类型,所以在C90中它有unsigned long int
类型。
正如您所说,此问题的常见解决方法是编写-2147483647 - 1
。 如果检查系统的limits.h
您可能会看到与INT_MIN
定义类似的东西。
关于输出4
,这表明在您的MinGW系统上使用C90,而在您的其他系统上使用C99或C11(或C ++或GCC扩展)。