2012-07-31 8 views

Respuesta

5

Esta es la implementación definida como las respuestas anteriores ya dicen.

Mi gcc maneja 'ab' como un int. El siguiente código:

printf("sizeof('ab') = %zu \n", sizeof('ab')); 
printf("'ab' = 0x%08x \n", 'ab'); 
printf("'abc' = 0x%08x \n", 'abc'); 

impresiones:

sizeof('ab') = 4 
'ab' = 0x00006162 
'abc' = 0x00616263 

En su código, la línea:

char c = 'ab'; 

se puede considerar como:

char c = (char)(0x00006162 & 0xFF); 

lo que C tiene la valor del último carácter de 'ab'. En este caso, es 'b' (0x62).

1

Debido 'ab' tiene tipo int y una char sólo puede contener un byte.

+0

Eso no responde la pregunta, por lo que se obtiene 'b' en lugar de 'a', no por qué se obtiene 'b' en lugar de 'ab'. –

+0

@JimBalter la pregunta fue editada y no tenía el * en lugar de 'a' * en el momento en que respondí. – ouah

+1

P.S. Como esta es una pregunta en C, ''a'' y''b'' también tienen tipo 'int'. –

5

El valor de una constante entera multi-personaje es definido por la implementación, según la norma C11 (§6.4.4.4 "Carácter constantes" al10 p69):

10 - [...] El valor de una constante de caracteres enteros que contiene más de un carácter (por ejemplo, 'ab') o que contiene un carácter o secuencia de escape que no se correlaciona con un carácter de ejecución de un solo byte, es definido en implementación. [...]

+0

Los estándares C90 y C99 tienen la misma regla. –

10

Según el estándar, está implementado. De 6.4.4.4 Carácter constantes de:

una constante entera personaje 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. El valor de una constante de caracteres enteros que contiene más de un carácter (por ejemplo, 'ab') o contiene un carácter o secuencia de escape que no se correlaciona con un carácter de ejecución de un solo byte, está definido por la implementación.

+1

@ouah, ¿cómo no? Está indicando que depende de la implementación qué valor 'int' le asigna a un literal de múltiples caracteres. – hmjd

+0

@ouah No importa cuál sea el valor de una constante de un solo carácter, 'b' todavía se representa como 'b'. Esta respuesta responde a la pregunta de por qué 'b' en lugar de 'a' (es decir, depende de la implementación), cuya respuesta ni siquiera se toca. –

+0

@JimBalter en realidad el OP editó su pregunta para agregar el * en lugar de 'a' * que en mi humilde opinión cambiar un poco las intenciones de la pregunta original. – ouah

-1

Edición posterior: mi respuesta fue complementaria a las anteriores que indicaban claramente que se trata de un comportamiento específico de implementación. Tenía la impresión de que OP quería saber, con eso en mente, por qué el compilador eligió 'b' por 'a'. Lo siento si mi respuesta fue confusa.

Endianess. Es por eso que obtienes 'b' en lugar de 'a'. Debido a cómo se representa eso en la memoria de su máquina. Y su máquina es probablemente pequeña endian.

Pruébalo en un sparc o en un mipsbe o en un brazo y puedes obtener 'a' en lugar de 'b'.

En cualquier caso, espero que no dependa de esto para el código de producción real.

+0

No solo endianess. Incluso el orden de los caracteres en el valor en sí no está definido. Los diferentes compiladores con los mismos endians usan una representación diferente (por ejemplo, GCC vs. Visual Studio). – Suma

+0

De hecho. Pero pensé que eso ya estaba resuelto por las respuestas anteriores. Solo estaba tratando de aclarar por qué el OP podría obtener 'b's' en lugar de 'a's en su prueba. El compilador puede elegir la manera más fácil de representar y acceder a eso según la plataforma en la que se esté ejecutando. –

Cuestiones relacionadas