Сначала согласно ANSI / IEC 9899: 1999 (E) §6.4.4.4:
10. Целочисленная символьная константа имеет тип int. Значение целочисленной символьной константы
содержащий один символ, который отображается на однобайтовый символ выполнения
Числовое значение представления сопоставленного символа интерпретируется как целое число. [...]
§6.5.3.4:
2. Оператор sizeof возвращает размер (в байтах) своего операнда, который может быть
выражение или заключенное в скобки имя типа. Размер определяется по типу
операнд. [...]
3. При применении к операнду с типом char, без знака или со знаком,
(или квалифицированная версия этого) результат 1. [...]
Как видите, поскольку символьная константа имеет тип int
, для sizeof('a')
мы получаем sizeof(int)
, что равно 4 на вашей платформе. Однако для sizeof(c)
мы получаем размер char
, который определен как 1.
Так почему мы можем присвоить 'a'
char
?
§6.5.16.1:
2. В простом присваивании (=) значение правого операнда преобразуется в тип выражения присваивания и заменяет значение, хранящееся в объекте, обозначенном левым операндом.
Итак, int
, то есть 'a'
, неявно преобразуется в char
. Там также есть пример, явно показывающий, что int
s может быть неявно преобразовано в char
.