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

use*_*528 14 c sizeof

#include<stdio.h>

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

输出:

8  
4
Run Code Online (Sandbox Code Playgroud)

我知道这sizeof(2147483648)是8个字节,因为它不能适合4个字节并被提升为long long int.但我不明白发生了什么事情sizeof(2147483647+1)

我发现了类似的问题,但没有讨论第二种情况.

oua*_*uah 19

用C整数常量的规则是,一个十进制整数常数具有其中它可以在被表示到第一类型:int,long,long long.

2147483648
Run Code Online (Sandbox Code Playgroud)

不适合入int到您的系统(如最大int在您的系统2147483647),所以它的类型是long(或long long取决于你的系统).所以你在计算sizeof (long)(或sizeof (long long)取决于你的系统).

2147483647
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 我怀疑它会调用UB.不会评估"2147483647 + 1". (3认同)
  • 你确定这里有未定义的行为,假设表达式作为`sizeof`的参数出现而不是在它将被评估的上下文中? (2认同)
  • 作为旁注:`sizeof(1/0)`也产生与`sizeof(int)`相同的东西 (2认同)