2010-02-12 15 views
42

me trataronEn C, ¿por qué sizeof (char) 1, cuando 'a' es un int?

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

y tiene 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?

+3

que creo que tiene que ver con la promoción automática entero, alguien con más hechos que la creencia publicará una fáctico respuesta –

+2

@Roger: Se pregunta sobre la diferencia entre C y C++ sizeof ('a'), mientras que Pregunté si ocurre una conversión? Ver el cuerpo de la pregunta. Ya deduje que 'a' es un número entero en C. – legends2k

+0

Tengo que agradecer a "David Rodríguez - dribeas" por señalar que el enlace en mi respuesta es incorrecto. Estoy borrando mi respuesta. legends2k, la respuesta correcta debería ir a Peter o Neil, en mi humilde opinión. –

Respuesta

35

En C 'a' es una constante entera (!?!), Por lo que 4 es correcto para su arquitectura. 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.

+13

+ 1 para "pero a menudo es bytes", todavía estoy riendo :) –

+0

solía ser un número entero de 2 bytes .. el estándar tampoco define eso. – lexu

+0

¿Puedo saber la razón detrás de la norma que establece 'sizeof (char)' siempre debe ser 1? ¿Es porque la tabla ASCII tiene 256 caracteres? ¿Qué sucede si en una implementación necesito tener más que eso, decir unicode? – legends2k

0

De acuerdo con las normas ANSI C, un char es ascendido a un int en el contexto en que se usan números enteros, que utilizó un especificador de formato de número 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 compilador.

+5

El formato entero se refería a sizeof ('a') no 'a' así que no lo hago Veamos cómo se sostiene este argumento. –

+1

El estándar C dice que un carácter literal es de tipo int, tiene sizeof int y no se trata de promoción. –

+1

Su respuesta parece sugerir que el compilador de C inspecciona una cadena de formato utilizada por una función de biblioteca al compilar un programa, ¿está seguro de que ese es el caso? –

7

Th C estándar dice que un carácter literal como 'a' es de tipo int, no escriba char. Por lo tanto, tiene (en su plataforma) sizeof == 4. Vea this question para una discusión más completa.

+0

Pregunté sobre la promoción/casting que ocurre entre los dos tipos de datos, mientras que la discusión/respuesta no responde esto. – legends2k

+1

@ legends2K Usted preguntó "Si el tamaño de un personaje es uno, ¿por qué 'c' me da 4?" Como esta respuesta y la pregunta que he vinculado explican que 'a' tiene un tamaño de == 4, obviamente no se está produciendo ningún casting o promoción. –

+0

Bueno. hay una forma detallada de la pregunta, debajo de ella, que dice "¿hay un encasillado implícito ocurriendo, bajo el capó, desde ese valor de 4 bytes a un valor de 1 byte cuando se asigna a la variable char". Esto también es parte de eso, creo. – legends2k

5

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, obtiene 1.
  • Para una expresión, sizeof devuelve el tamaño del tipo de la variable o expresión. Como un carácter literal se escribe como int, se obtiene 4.
4

Esto se trata en la norma ISO C11 6.4.4.4 Character constants aunque es prácticamente igual al de las normas anteriores. Eso indica, en el párrafo /10:

Una constante de caracteres enteros tiene tipo int. El valor de una constante de caracteres enteros que contiene un único 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 número entero.

+0

+1 gracias por citar el estándar; Me pregunto por qué _elemento de carácter constante_ se eligió sobre _carácter constante_. – legends2k