Trở lại khi C đang được viết, hợp ngữ MACRO-11 của PDP-11 có:
MOV #'A, R0 // 8-bit character encoding for 'A' into 16 bit register
Loại điều này khá phổ biến trong hợp ngữ - 8 bit thấp sẽ giữ mã ký tự, các bit khác bị xóa thành 0. PDP-11 thậm chí còn có:
MOV #"AB, R0 // 16-bit character encoding for 'A' (low byte) and 'B'
Điều này cung cấp một cách thuận tiện để tải hai ký tự vào byte thấp và byte cao của thanh ghi 16 bit. Sau đó, bạn có thể viết chúng ở nơi khác, cập nhật một số dữ liệu văn bản hoặc bộ nhớ màn hình.
Vậy nên, việc các nhân vật được thăng cấp đăng ký size là điều khá bình thường và đáng mong đợi. Tuy nhiên, giả sử bạn cần đưa 'A' vào thanh ghi không phải là một phần của opcode được mã hóa cứng, mà từ một nơi nào đó trong bộ nhớ chính có chứa:
address: value
20: 'X'
21: 'A'
22: 'A'
23: 'X'
24: 0
25: 'A'
26: 'A'
27: 0
28: 'A'
Nếu bạn chỉ muốn đọc một chữ 'A' từ bộ nhớ chính này vào một thanh ghi, bạn sẽ đọc cái nào?
Một số CPU có thể chỉ hỗ trợ trực tiếp đọc giá trị 16 bit vào thanh ghi 16 bit, có nghĩa là việc đọc ở 20 hoặc 22 sau đó sẽ yêu cầu các bit từ 'X' được xóa và tùy thuộc vào khả năng sử dụng của CPU này hay khác sẽ cần chuyển sang byte thứ tự thấp.
Một số CPU có thể yêu cầu đọc căn chỉnh bộ nhớ, có nghĩa là địa chỉ thấp nhất liên quan phải là bội số của kích thước dữ liệu: bạn có thể đọc từ địa chỉ 24 và 25, nhưng không đọc được từ địa chỉ 27 và 28.
Vì vậy, một trình biên dịch tạo mã để lấy một chữ 'A' vào thanh ghi có thể thích lãng phí thêm một chút bộ nhớ và mã hóa giá trị thành 0 'A' hoặc 'A' 0 - tùy thuộc vào endianness và cũng đảm bảo nó được căn chỉnh đúng cách ( tức là không ở một địa chỉ bộ nhớ lẻ).
Tôi đoán là C chỉ đơn giản là thực hiện hành vi tập trung vào CPU ở mức độ này, nghĩ đến các hằng số ký tự chiếm các kích thước thanh ghi của bộ nhớ, dẫn đến đánh giá chung về C là "trình hợp dịch cấp cao".
(Xem 6.3.3 trên trang 6-25 của http://www.dmv.net/dec/pdf/macro.pdf )