sizeof(2147483648) 是 8 个字节,而 sizeof(2147483647+1) 是 4 个字节

sizeof(2147483648) is 8 bytes while sizeof(2147483647+1) is 4 bytes

#include<stdio.h>

int main()
{
    printf("%d\n", sizeof(2147483648));
    printf("%d"  , sizeof(2147483647+1)); 
    return 0;
}

输出:

8  
4

我知道 sizeof(2147483648) 是 8 个字节,因为它不能容纳在 4 个字节中,因此被提升为 long long int。但我不明白在 sizeof(2147483647+1)

的情况下会发生什么

我找到了一个similar question但是里面没有讨论第二种情况。

C中整型常量的规则是十进制整型常量有第一个类型可以表示为:int, long, long long.

2147483648

不适合您系统中的 int(因为您系统中的最大值 int2147483647)所以它的类型是 long(或long long 取决于您的系统)。因此,您正在计算 sizeof (long)(或 sizeof (long long),具体取决于您的系统)。

2147483647

在您的系统中是一个 int,如果您将 1 添加到 int,它仍然是一个 int。所以你正在计算 sizeof (int).

请注意,sizeof(2147483647+1) 在您的系统中调用未定义的行为,因为 INT_MAX + 1 溢出和有符号整数溢出是 C 中的未定义行为。

请注意,虽然通常 2147483647+1 会在您的系统中调用未定义的行为(INT_MAX + 1 溢出和有符号整数溢出是 C 中的未定义行为),但 sizeof(2147483647+1) 不会调用未定义的行为,因为在这种情况下,sizeof 的操作数未被评估。