为什么-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

您的系统似乎都有intlong为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扩展)。