Als C geschrieben wurde, hatte die MACRO-11-Assemblersprache des PDP-11:
MOV #'A, R0 // 8-bit character encoding for 'A' into 16 bit register
Diese Art von Dingen ist in der Assemblersprache weit verbreitet - die niedrigen 8 Bits enthalten den Zeichencode, andere Bits werden auf 0 gelöscht. PDP-11 hatte sogar:
MOV #"AB, R0 // 16-bit character encoding for 'A' (low byte) and 'B'
Dies bot eine bequeme Möglichkeit, zwei Zeichen in die niedrigen und hohen Bytes des 16-Bit-Registers zu laden. Sie können diese dann an eine andere Stelle schreiben und einige Textdaten oder den Bildschirmspeicher aktualisieren.
Die Idee, Zeichen zur Registergröße zu befördern, ist also ganz normal und wünschenswert. Angenommen, Sie müssen 'A' nicht als Teil des fest codierten Opcodes in ein Register eintragen, sondern von einem Ort im Hauptspeicher, der Folgendes enthält:
address: value
20: 'X'
21: 'A'
22: 'A'
23: 'X'
24: 0
25: 'A'
26: 'A'
27: 0
28: 'A'
Wenn Sie nur ein 'A' aus diesem Hauptspeicher in ein Register einlesen möchten, welches würden Sie lesen?
Einige CPUs unterstützen möglicherweise nur das direkte Einlesen eines 16-Bit-Werts in ein 16-Bit-Register, was bedeuten würde, dass beim Lesen bei 20 oder 22 die Bits von 'X' gelöscht werden müssen, und dies hängt von der Endigkeit der CPU ab müsste in das Byte niedriger Ordnung verschoben werden.
Einige CPUs erfordern möglicherweise einen speicherausgerichteten Lesevorgang. Dies bedeutet, dass die niedrigste betroffene Adresse ein Vielfaches der Datengröße sein muss: Möglicherweise können Sie von den Adressen 24 und 25 lesen, nicht jedoch von den Adressen 27 und 28.
Ein Compiler, der Code generiert, um ein 'A' in das Register zu bringen, kann es daher vorziehen, ein wenig zusätzlichen Speicher zu verschwenden und den Wert als 0 'A' oder 'A' 0 zu codieren - abhängig von der Endianität und auch sicherzustellen, dass er richtig ausgerichtet ist ( dh nicht an einer ungeraden Speicheradresse).
Ich vermute, dass Cs diese Ebene des CPU-zentrierten Verhaltens einfach übernommen haben, indem sie an Zeichenkonstanten gedacht haben, die Registergrößen des Speichers belegen, was die allgemeine Einschätzung von C als "High-Level-Assembler" bestätigt.
(Siehe 6.3.3 auf Seite 6-25 von http://www.dmv.net/dec/pdf/macro.pdf )