En C, ¿por qué sizeof (char) 1, cuando ‘a’ es un int?

Lo intenté

printf("%d, %d\n", sizeof(char), sizeof('c'));

y obtuve 1, 4 como salida. Si el tamaño de un personaje es uno, ¿por qué 'c' me da 4? Supongo que es porque es un número entero. Entonces cuando hago char ch = 'c'; ¿Hay una conversión implícita ocurriendo, bajo el capó, de ese valor de 4 bytes a un valor de 1 byte cuando se asigna a la variable char?

En C ‘a’ es una constante entera (!?!), Entonces 4 es correcto para su architecture. Se convierte implícitamente en char para la asignación. sizeof (char) es siempre 1 por definición. El estándar no dice qué unidades es 1, pero a menudo es bytes.

El estándar Th C dice que un carácter literal como ‘a’ es de tipo int, no escriba char. Por lo tanto, tiene (en su plataforma) tamaño de == 4. Vea esta pregunta para una discusión más completa.

Es el comportamiento normal del operador sizeof (Ver Wikipedia ):

  • Para un tipo de datos, sizeof devuelve el tamaño del tipo de datos. Para char , obtienes 1.
  • Para una expresión, sizeof devuelve el tamaño del tipo de la variable o expresión. Como un literal de carácter se escribe como int , obtienes 4.

Esto está cubierto en ISO C11 6.4.4.4 Character constants aunque en gran medida no ha cambiado desde estándares anteriores. Eso dice, en el párrafo /10 :

Una constante de caracteres enteros tiene tipo int. El valor de una constante de caracteres enteros que contiene un solo carácter que se asigna a un carácter de ejecución de un solo byte es el valor numérico de la representación del carácter correlacionado interpretado como un entero.

De acuerdo con los estándares de ANSI C, un char es promovido a un int en el contexto donde se usan enteros, usted utilizó un especificador de formato entero en el printf por lo tanto, los diferentes valores. Una char suele ser de 1 byte, pero esa es una implementación definida en función del tiempo de ejecución y el comstackdor.