El programa
#include <stdio.h> int main(void) { printf("sizeof( char ) = %zu, sizeof 'a' = %zu.\n", sizeof( char ), sizeof 'a' ); return 0; }genera lo siguiente:
sizeof( char ) = 1, sizeof 'a' = 4.Estoy compilando con gcc (clang da el mismo resultado) y estas banderas:
gcc -Wall -Wextra -Wswitch -pedantic -ansi -std=c11 -DDEBUG -ggdb3 -oLa sección 6.5.3.4 párrafo 4 de la especificación en http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf dice
4 Cuando se aplica sizeof a un operando que tiene el tipo char, char sin signo o char con signo (o una versión calificada del mismo), el resultado es 1.
Entonces, esperaría que el tamaño del operando 'a' sea 1 porque el tipo de 'a' es char, o ¿se está "promocionando" automáticamente a un int, o algo similar? (Me doy cuenta de que si lanzo 'a' a char, entonces sizeof((char)'a' ) es 1).
¿O estoy mirando el estándar equivocado?
En C, opuesto a C++, las constantes de caracteres enteros (literales) tienen el tipo int .
Entonces, el valor de la expresión sizeof( 'a' ) es igual al valor de la expresión sizeof( int ) . Mientras que sizeof( char ) siempre es igual a 1 .
Del estándar C (6.5.3.4 Los operadores sizeof y alignof)
4 Cuando se aplica sizeof a un operando que tiene el tipo char, char sin signo o char con signo (o una versión calificada del mismo), el resultado es 1...
y (6.4.4.4 Constantes de caracteres)
10 Una constante de carácter entero tiene tipo int. El valor de una constante de carácter entero 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 asignado interpretado como un número entero. El valor de una constante de carácter entero que contiene más de un carácter (por ejemplo, 'ab'), o que contiene un carácter o una secuencia de escape que no se asigna a un carácter de ejecución de un solo byte, está definido por la implementación. Si una constante de carácter entero contiene un solo carácter o secuencia de escape, su valor es el que resulta cuando un objeto con tipo char cuyo valor es el del solo carácter o secuencia de escape se convierte al tipo int.
Fíjate que normalmente los objetos del tipo char usados en operaciones como operandos o en expresiones se convierten al tipo int debido a las promociones de enteros.
Las constantes de carácter (o más exactamente, una constante de carácter entero ) tienen tipo int .
La sección 6.4.4.4p2 del estándar C describe las constantes de caracteres:
Una constante de carácter entero es una secuencia de uno o más caracteres multibyte encerrados entre comillas simples, como en
'x'. Una constante de carácter ancho es la misma, excepto que tiene como prefijo la letraL,uoU. Con algunas excepciones detalladas más adelante, los elementos de la secuencia son miembros del conjunto de caracteres de origen; se asignan de una manera definida por la implementación a los miembros del conjunto de caracteres de ejecución
Y la semántica, que incluye una descripción del tipo, se describe primero en el párrafo 10:
Una constante de carácter entero tiene tipo
int. El valor de una constante de carácter entero 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 asignado interpretado como un número entero. El valor de una constante de carácter entero que contiene más de un carácter (por ejemplo, 'ab'), o que contiene un carácter o una secuencia de escape que no se asigna a un carácter de ejecución de un solo byte, está definido por la implementación. Si una constante de carácter entero contiene un solo carácter o secuencia de escape, su valor es el que resulta cuando un objeto con tipocharcuyo valor es el del solo carácter o secuencia de escape se convierte al tipoint
En lenguaje C, el character literal no es un tipo char . C considera el carácter literal como integer . Entonces, no hay diferencia entre sizeof('a') y sizeof(1) .
el tamaño del carácter literal es igual al tamaño del entero