ย้อนกลับไปตอนที่เขียน C ภาษาแอสเซมบลี MACRO-11 ของ PDP-11 มี:
MOV #'A, R0 // 8-bit character encoding for 'A' into 16 bit register
สิ่งนี้พบได้บ่อยในภาษาแอสเซมบลี - 8 บิตต่ำจะเก็บโค้ดอักขระส่วนบิตอื่น ๆ เคลียร์เป็น 0 PDP-11 ยังมี:
MOV #"AB, R0 // 16-bit character encoding for 'A' (low byte) and 'B'
นี่เป็นวิธีที่สะดวกในการโหลดอักขระสองตัวในไบต์ต่ำและสูงของการลงทะเบียน 16 บิต จากนั้นคุณอาจเขียนสิ่งเหล่านั้นไว้ที่อื่นอัปเดตข้อมูลข้อความหรือหน่วยความจำหน้าจอ
ดังนั้นความคิดของตัวละครที่ได้รับการส่งเสริมให้มีขนาดลงทะเบียนจึงค่อนข้างปกติและเป็นที่ต้องการ แต่สมมติว่าคุณต้องรับ 'A' ในรีจิสเตอร์ที่ไม่ใช่ส่วนหนึ่งของ opcode แบบฮาร์ดโค้ด แต่มาจากที่ใดที่หนึ่งในหน่วยความจำหลักที่มี:
address: value
20: 'X'
21: 'A'
22: 'A'
23: 'X'
24: 0
25: 'A'
26: 'A'
27: 0
28: 'A'
ถ้าคุณต้องการอ่านแค่ 'A' จากหน่วยความจำหลักนี้ลงในรีจิสเตอร์คุณจะอ่านอันไหน?
ซีพียูบางตัวอาจรองรับการอ่านค่า 16 บิตในการลงทะเบียน 16 บิตโดยตรงซึ่งหมายความว่าการอ่านที่ 20 หรือ 22 จะต้องมีการล้างบิตจาก 'X' และขึ้นอยู่กับความสิ้นสุดของ CPU อย่างใดอย่างหนึ่ง จะต้องเปลี่ยนเป็นไบต์ลำดับต่ำ
ซีพียูบางตัวอาจต้องการการอ่านที่จัดตำแหน่งหน่วยความจำซึ่งหมายความว่าแอดเดรสต่ำสุดที่เกี่ยวข้องจะต้องมีขนาดข้อมูลหลายขนาดคุณอาจอ่านได้จากที่อยู่ 24 และ 25 แต่ไม่ใช่ 27 และ 28
ดังนั้นคอมไพเลอร์ที่สร้างโค้ดเพื่อรับ 'A' ลงในรีจิสเตอร์อาจต้องการที่จะเสียหน่วยความจำเพิ่มเล็กน้อยและเข้ารหัสค่าเป็น 0 'A' หรือ 'A' 0 - ขึ้นอยู่กับ endianness และตรวจสอบให้แน่ใจว่ามันอยู่ในแนวเดียวกันอย่างถูกต้อง ( เช่นไม่อยู่ในที่อยู่หน่วยความจำแปลก ๆ )
ฉันเดาว่า C เพียงแค่ดำเนินการในระดับนี้ของพฤติกรรมที่เน้น CPU เป็นศูนย์กลางโดยนึกถึงค่าคงที่ของอักขระที่มีขนาดการลงทะเบียนของหน่วยความจำโดยพิจารณาจากการประเมินทั่วไปของ C ว่าเป็น "แอสเซมเบลอร์ระดับสูง"
(ดู 6.3.3 ในหน้า 6-25 ของhttp://www.dmv.net/dec/pdf/macro.pdf )