Sau đây là cách tiêu chuẩn (ISO 14882) giải thích hủy bỏ -1> sizeof (int)
hành Relational `>' được định nghĩa trong 5.9 (expr.rel/2)
Chuyển đổi số học thông thường là được thực hiện trên toán hạng số học hoặc loại liệt kê. ...
Quá trình chuyển đổi số học thông thường được định nghĩa trong 5 (expr/9)
... Các mô hình được gọi là chuyển đổi số học thông thường, được định nghĩa như sau:
- Nếu một trong hai toán hạng có loại dài đôi, ...
- Nếu không, nếu toán hạng là dobule, ...
- Nếu không, nếu toán hạng là nổi, ...
- Nếu không, các quảng cáo tích phân sẽ được thực hiện trên cả hai toán hạng.
- ...
Các chương trình khuyến mãi không thể thiếu được định nghĩa trong 4.5 (conv.prom/1)
Một rvalue kiểu char, ký char, unsigned char, short int, hoặc unsigned int ngắn có thể được chuyển đổi sang một rvalue kiểu int nếu int thể đại diện cho tất cả các giá trị của nguồn loại; nếu không, giá trị mã nguồn có thể là được chuyển đổi thành giá trị loại int chưa được ký.
Kết quả của sizeof được định nghĩa trong 5.3.3 (expr.sizeof/6)
Kết quả là một hằng số kiểu size_t
size_t được định nghĩa trong tiêu chuẩn C (ISO 9899), là loại số nguyên không dấu.
Vì vậy, đối với -1 > sizeof(int)
, trình kích hoạt> kích hoạt chuyển đổi số học thông thường. Chuyển đổi số học thông thường chuyển đổi -1 thành int không dấu vì int không thể biểu thị tất cả giá trị của size_t
. -1
trở thành một số rất lớn phụ thuộc vào nền tảng. Vì vậy, -1 > sizeof(int)
là true
.
Nó chỉ có thể là một lỗi đánh máy nhưng 'size_t' là _an_ unsigned số nguyên và nó không phải là trường hợp' int' không thể đại diện cho tất cả các giá trị của 'size_t' (' size_t' có thể là 'unsigned short '), mặc dù nó rõ ràng là không thể trên nền tảng của người hỏi câu hỏi. –
'(unsigned T) -1' không chỉ là một giá trị lớn, đó là * giá trị lớn nhất' unsigned T' có thể giữ. – GManNickG
Tôi biết rõ tiêu chuẩn cho phép. :) -1 luôn là lớn nhất, đọc các quy tắc chuyển đổi. Hoặc http://stackoverflow.com/questions/809227/is-it-safe-to-use-1-to-set-all-bits-to-true/809341#809341 – GManNickG