Nó luôn là một trong C99, phần 6.5.3.4:
Khi áp dụng cho một toán hạng có kiểu char, unsigned char, hoặc sign char, (hoặc phiên bản đủ điều kiện của chúng), kết quả là 1.
Chỉnh sửa: không phải là một phần của câu hỏi của bạn, nhưng vì sự quan tâm của Harbison và Steele, xuất bản lần thứ 3. (trước c99) tr. 148:
Một đơn vị lưu trữ được coi là dung lượng lưu trữ được chiếm bởi một ký tự; do đó kích thước của một đối tượng kiểu char
là 1.
Chỉnh sửa: Để trả lời cho câu hỏi cập nhật của bạn, câu hỏi và câu trả lời sau đây của Harbison và Steele là có liên quan (sđd, ví dụ: 4 của Ch. 6):
Có được phép triển khai C trong đó kiểu char
có thể đại diện cho các giá trị từ -2,147,483,648 đến 2,147,483,647 không? Nếu vậy, những gì sẽ được sizeof(char)
thực hiện theo? Phạm vi loại nhỏ nhất và lớn nhất sẽ là int
gì?
Trả lời (sđd, tr. 382):
Được phép (nếu lãng phí) khi triển khai sử dụng 32 bit để biểu diễn kiểu char
. Bất kể việc triển khai như thế nào, giá trị của
sizeof(char)
luôn là 1.
Mặc dù điều này không giải quyết cụ thể trường hợp, ví dụ byte là 8 bit và char
là 4 trong số các byte đó (thực sự là không thể với định nghĩa c99, xem bên dưới), thực tế là sizeof(char) = 1
luôn rõ ràng so với tiêu chuẩn c99 và Harbison và Steele.
Chỉnh sửa: Thực tế (đây là câu trả lời cho câu hỏi cập nhật 2 của bạn), theo như c99 có liên quan sizeof(char)
là byte, từ phần 6.5.3.4 một lần nữa:
Toán tử sizeof mang lại kích thước (tính bằng byte) cho toán hạng của nó
vì vậy kết hợp với phần trích dẫn ở trên, byte 8 bit và char
4 byte trong số đó là không thể: đối với c99, một byte giống như a char
.
Để trả lời cho đề cập của bạn về khả năng có 7 bit char
: điều này là không thể trong c99. Theo mục 5.2.4.2.1 của tiêu chuẩn, mức tối thiểu là 8:
Các giá trị được xác định bằng cách triển khai của chúng sẽ bằng hoặc lớn hơn [sự nhấn mạnh của tôi] về độ lớn so với những giá trị được hiển thị, có cùng dấu hiệu.
- số bit cho đối tượng nhỏ nhất không phải là trường bit (byte)
**CHAR_BIT 8**
- giá trị tối thiểu cho một đối tượng kiểu ký hiệu char
**SCHAR_MIN -127//−(27−1)**
- giá trị lớn nhất cho một đối tượng kiểu ký hiệu char
**SCHAR_MAX +127//27−1**
- giá trị lớn nhất cho một đối tượng kiểu unsigned char
**UCHAR_MAX 255//28−1**
- giá trị tối thiểu cho một đối tượng kiểu char
**CHAR_MIN** see below
- giá trị lớn nhất cho một đối tượng kiểu char
**CHAR_MAX** see below
[...]
Nếu giá trị của một đối tượng kiểu char được coi là số nguyên có dấu khi được sử dụng trong một biểu thức, thì giá trị của CHAR_MIN sẽ giống với giá trị của SCHAR_MIN và giá trị của CHAR_MAX sẽ giống như giá trị của SCHAR_MAX. Nếu không, giá trị của CHAR_MIN sẽ là 0 và giá trị của CHAR_MAX sẽ giống như giá trị của UCHAR_MAX. Giá trị UCHAR_MAX sẽ bằng 2 ^ CHAR_BIT - 1.