#include <stdio.h>
int main() {
printf("sizeof(int): %zu\n", sizeof(int));
printf("%d\n", 2147483648u > -2147483648);
printf("%d\n", ((unsigned int)2147483648u) > ((int)-2147483648));
printf("%d\n", 2147483648u != -2147483648);
printf("%d\n", ((unsigned int)2147483648u) != ((int)-2147483648));
return 0;
}
Kết quả của mã này trong cả C và C++, trên cygwin64 và một máy rhel6.4 với gcc 5.2.0 là:Hiểu 2^31 và -2^31 nguyên khuyến mãi
sizeof(int): 4
1
0
1
0
Theo "Integer promotions", 2147483648u
sẽ thuộc loại unsigned int
(ngay cả khi không có hậu tố u
) và -2147483648
loại int
(như thường lệ). Tại sao các kết quả khác nhau bằng cách truyền rõ ràng?
Theo "Usual arithmetic conversions", đoạn này được áp dụng:
Nếu không, signedness là khác nhau: Nếu toán hạng với loại unsigned có hơn rank chuyển đổi hoặc bằng so với thứ hạng của loại các toán hạng ký, sau đó các toán hạng với ký kiểu là mặc nhiên được chuyển đổi để loại unsigned
Điều này có nghĩa rằng kết quả đúng là như thể:
2147483648u > 2147483648u
2147483648u != 2147483648u
được thực hiện, vì trong 32 bit, ký -2^31 và dấu 2^31 có cùng biểu diễn. Nói cách khác, kết quả với phép đúc là chính xác. Chuyện gì vậy?
Tôi có cảm giác bằng cách nào đó, quảng cáo số nguyên cấp cao hơn được áp dụng mà không cần truyền, vì vậy tôi nhận được ví dụ: một quảng cáo được ký kết 64 bit trên cả hai mặt - nhưng tại sao?
Cả hai tệp thi hành đều được biên dịch dưới dạng 64 bit, điều này có thể đóng một vai trò không?
Vui lòng chọn một trong C và C++. Hai ngôn ngữ này khác nhau và câu trả lời có thể khác nhau cho cả hai ngôn ngữ. – fuz
@FUZxxl: Không phải, trong trường hợp này. – DevSolar
Ngoài ra, bạn đang biên soạn chuẩn C nào? Xử lý các hằng số nguyên thay đổi trong C11. – fuz