Размер выражения char

Может ли кто-нибудь рассказать, как sizeof(char expression) будет sizeof(int)?

int main()
{
char a, b;
printf("%d\n", sizeof(a+b));
return 0;
}

Программа выводит 4 в качестве вывода. Я ожидал, что это будет sizeof(char) т.е. 1

Ответ 1

Целое продвижение по службе.

Когда малые интегральные типы (меньше int, такие как char, short и т.д.), находятся в арифметическом выражении, они автоматически повышаются до int.


C11 §6.3.1.1 Булево, символы и целые числа

Если int может представлять все значения исходного типа (ограниченные шириной для битового поля), значение преобразуется в int; в противном случае он преобразуется в unsigned int. Они называются целыми акциями. 58)

И в сноске:

58) Целые рекламные акции применяются только: как часть обычных арифметических преобразований к некоторым выражениям аргумента к операндам унарных операторов +, - и ~, а также для обоих операндов операторы сдвига, как указано в их соответствующих подпунктах.

Ответ 2

a+b - выражение int. a и b будут char выражениями.

При использовании большинства операторов в C операнды интегрального типа, но более узкие, чем int, продвигаются до int.

Ответ 3

Согласно стандарту C (6.5.6 аддитивные операторы):

4 Если оба операнда имеют арифметический тип, обычная арифметика на них выполняются преобразования.

Обычные арифметические преобразования включают целую рекламу (6.3.1.1 Логические, символы и целые числа):

Если int может представлять все значения исходного типа (как ограниченный по ширине, для битового поля), значение преобразуется в int; в противном случае он преобразуется в unsigned int. Они называются целые рекламные акции

Итак, в этом выражении

a + b

оба операнда преобразуются в тип int, и результат имеет этот общий тип операндов, который int