¿Cómo determinar el resultado de asignar constante de caracteres múltiples a una variable char?

¿Por qué una variable char obtiene ‘b’ de la asignación de ‘ab’, en lugar de ‘a’?

char c = 'ab'; printf("c: %c\n", c); 

Huellas dactilares:

 c: b 

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

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' ); 

huellas dactilares:

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

En tu código, la línea:

 char c = 'ab'; 

Puede ser considerado como:

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

Entonces c obtiene el valor del último carácter de ‘ab’. En este caso, es ‘b’ (0x62).

De acuerdo con el estándar, es implementación definida. De 6.4.4.4 constantes de caracteres :

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. 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, está definido por la implementación.

El valor de una constante de múltiples caracteres enteros está definido por la implementación, de acuerdo con el estándar C11 ( §6.4.4.4 “Constantes de caracteres” 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, está definido por la implementación . […]

Porque 'ab' tiene tipo int y un char solo puede contener un byte.

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 comstackdor eligió ‘b’ por ‘a’. Lo siento si mi respuesta fue confusa.

Endianess. Es por eso que obtienes ‘b’ en lugar de ‘a’. Por la forma en que está representado en la memoria de su máquina. Y tu máquina probablemente sea pequeña endian.

Pruébalo en un sparc o en un mipsbe o en un arm y podrías obtener ‘a’ en lugar de ‘b’.

En cualquier caso, espero que no estés dependiendo de esto para el código de producción real.