Cuando se estaba escribiendo C, el lenguaje ensamblador MACRO-11 del PDP-11 tenía:
MOV #'A, R0 // 8-bit character encoding for 'A' into 16 bit register
Este tipo de cosas es bastante común en el lenguaje ensamblador: los 8 bits bajos mantendrán el código de carácter, otros bits se borran a 0. PDP-11 incluso tenía:
MOV #"AB, R0 // 16-bit character encoding for 'A' (low byte) and 'B'
Esto proporcionó una manera conveniente de cargar dos caracteres en los bytes bajos y altos del registro de 16 bits. Luego, puede escribirlos en otro lugar, actualizando algunos datos textuales o memoria de pantalla.
Por lo tanto, la idea de que los personajes se promuevan para registrar el tamaño es bastante normal y deseable. Pero, digamos que necesita introducir 'A' en un registro no como parte del código de operación codificado, sino desde algún lugar de la memoria principal que contenga:
address: value
20: 'X'
21: 'A'
22: 'A'
23: 'X'
24: 0
25: 'A'
26: 'A'
27: 0
28: 'A'
Si desea leer solo una 'A' de esta memoria principal en un registro, ¿cuál leería?
Es posible que algunas CPU solo admitan directamente la lectura de un valor de 16 bits en un registro de 16 bits, lo que significaría que una lectura a 20 o 22 requeriría que los bits de 'X' se borren, y dependiendo de la endianidad de la CPU, uno u otro necesitaría cambiar al byte de orden inferior.
Algunas CPU pueden requerir una lectura alineada con la memoria, lo que significa que la dirección más baja involucrada debe ser un múltiplo del tamaño de los datos: es posible que pueda leer de las direcciones 24 y 25, pero no 27 y 28.
Por lo tanto, un compilador que genera código para obtener una 'A' en el registro puede preferir desperdiciar un poco de memoria adicional y codificar el valor como 0 'A' o 'A' 0, dependiendo de la endianidad, y también asegurándose de que esté alineado correctamente ( es decir, no en una dirección de memoria impar).
Supongo que los C simplemente llevaron este nivel de comportamiento centrado en la CPU, pensando en constantes de caracteres que ocupan tamaños de registro de memoria, lo que confirma la evaluación común de C como un "ensamblador de alto nivel".
(Ver 6.3.3 en la página 6-25 de http://www.dmv.net/dec/pdf/macro.pdf )