Ai tempi in cui si scriveva C, il linguaggio assembly MACRO-11 del PDP-11 aveva:
MOV #'A, R0 // 8-bit character encoding for 'A' into 16 bit register
Questo genere di cose è abbastanza comune nel linguaggio assembly: gli 8 bit bassi conterranno il codice carattere, gli altri bit cancellati a 0. PDP-11 aveva anche:
MOV #"AB, R0 // 16-bit character encoding for 'A' (low byte) and 'B'
Ciò ha fornito un modo conveniente per caricare due caratteri nei byte basso e alto del registro a 16 bit. Potresti quindi scriverli altrove, aggiornando alcuni dati testuali o la memoria dello schermo.
Quindi, l'idea che i personaggi vengano promossi alla dimensione di registro è abbastanza normale e desiderabile. Ma diciamo che devi inserire 'A' in un registro non come parte dell'opcode hardcoded, ma da qualche parte nella memoria principale contenente:
address: value
20: 'X'
21: 'A'
22: 'A'
23: 'X'
24: 0
25: 'A'
26: 'A'
27: 0
28: 'A'
Se vuoi leggere solo una 'LA' da questa memoria principale in un registro, quale leggeresti?
Alcune CPU possono supportare direttamente la lettura di un valore a 16 bit in un registro a 16 bit, il che significherebbe che una lettura a 20 o 22 richiederebbe quindi la cancellazione dei bit da "X" e, a seconda dell'endianness della CPU, l'uno o l'altro avrebbe bisogno di spostarsi nel byte di ordine inferiore.
Alcune CPU potrebbero richiedere una lettura allineata alla memoria, il che significa che l'indirizzo più basso coinvolto deve essere un multiplo della dimensione dei dati: potresti essere in grado di leggere dagli indirizzi 24 e 25, ma non 27 e 28.
Quindi, un compilatore che genera codice per ottenere una 'A' nel registro potrebbe preferire sprecare un po 'di memoria extra e codificare il valore come 0' A 'o' A '0 - a seconda dell'endianness, e assicurandosi anche che sia allineato correttamente ( cioè non a un indirizzo di memoria dispari).
La mia ipotesi è che i C abbiano semplicemente trasferito questo livello di comportamento incentrato sulla CPU, pensando alle costanti dei caratteri che occupano dimensioni di registro della memoria, sostenendo la valutazione comune di C come un "assemblatore di alto livello".
(Vedere 6.3.3 a pagina 6-25 di http://www.dmv.net/dec/pdf/macro.pdf )