À l'époque où C était en cours d'écriture, le langage d'assemblage MACRO-11 du PDP-11 avait:
MOV #'A, R0 // 8-bit character encoding for 'A' into 16 bit register
Ce genre de chose est assez courant dans le langage d'assemblage - les 8 bits faibles contiendront le code de caractère, les autres bits effacés à 0. PDP-11 avait même:
MOV #"AB, R0 // 16-bit character encoding for 'A' (low byte) and 'B'
Cela a fourni un moyen pratique de charger deux caractères dans les octets bas et haut du registre 16 bits. Vous pouvez ensuite les écrire ailleurs, en mettant à jour certaines données textuelles ou la mémoire d'écran.
Ainsi, l'idée de caractères promus pour enregistrer la taille est tout à fait normale et souhaitable. Mais, disons que vous devez insérer 'A' dans un registre non pas dans le cadre de l'opcode codé en dur, mais depuis quelque part dans la mémoire principale contenant:
address: value
20: 'X'
21: 'A'
22: 'A'
23: 'X'
24: 0
25: 'A'
26: 'A'
27: 0
28: 'A'
Si vous voulez lire juste un «A» de cette mémoire principale dans un registre, lequel liriez-vous?
Certains processeurs peuvent uniquement prendre en charge la lecture d'une valeur 16 bits dans un registre 16 bits, ce qui signifierait qu'une lecture à 20 ou 22 nécessiterait alors l'effacement des bits de `` X '', et en fonction de l'endianité du processeur, l'un ou l'autre aurait besoin de passer dans l'octet de poids faible.
Certains processeurs peuvent nécessiter une lecture alignée sur la mémoire, ce qui signifie que l'adresse la plus basse impliquée doit être un multiple de la taille des données: vous pourrez peut-être lire à partir des adresses 24 et 25, mais pas 27 et 28.
Ainsi, un compilateur générant du code pour obtenir un 'A' dans le registre peut préférer gaspiller un peu de mémoire supplémentaire et encoder la valeur comme 0 'A' ou 'A' 0 - en fonction de l'endianness, et en s'assurant également qu'il est correctement aligné ( c'est-à-dire pas à une adresse mémoire impaire).
Je suppose que C a simplement porté ce niveau de comportement centré sur le processeur, en pensant aux constantes de caractère occupant des tailles de registre de mémoire, confirmant l'évaluation courante de C comme un "assembleur de haut niveau".
(Voir 6.3.3 à la page 6-25 de http://www.dmv.net/dec/pdf/macro.pdf )