Sizeof (2147483648) - 8 байт, а sizeof (2147483647 + 1) - 4 байта

#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)

Я нашел аналогичный вопрос, но он не обсуждает второй случай.

Ответы

Ответ 1

Правила целочисленной константы в C состоят в том, что десятичная целочисленная константа имеет первый тип, в котором ее можно представить в: int, long, long long.

2147483648

не вписывается в int в вашу систему (максимальный int в вашей системе 2147483647), поэтому его тип - long (или long long в зависимости от вашей системы). Таким образом, вы вычисляете sizeof (long) (или sizeof (long long) в зависимости от вашей системы).

2147483647

является int в вашей системе, и если вы добавите 1 в int, он все равно будет int. Итак, вы вычисляете sizeof (int).

Обратите внимание, что sizeof(2147483647+1) вызывает поведение undefined в вашей системе как переполнение INT_MAX + 1 и переполнения целочисленных целых чисел undefined в C.

Обратите внимание, что хотя обычно 2147483647+1 вызывает поведение undefined в вашей системе (INT_MAX + 1 переполнения и переполнения целочисленных целых чисел - это поведение undefined в C), sizeof(2147483647+1) не вызывает поведение undefined в качестве операнда sizeof в этом случае не оценивается.