Một số câu hỏi trên trang web này tiết lộ những cạm bẫy khi trộn các loại đã ký và chưa ký và hầu hết các trình biên dịch dường như thực hiện tốt công việc tạo cảnh báo loại này. Tuy nhiên, GCC dường như không quan tâm khi gán một hằng số đã ký cho một loại không dấu! Hãy xem xét các chương trình sau đây:Tại sao GCC không đưa ra cảnh báo khi gán chữ ký đã ký cho loại không dấu?
/* foo.c */
#include <stdio.h>
int main(void)
{
unsigned int x=20, y=-30;
if (x > y) {
printf("%d > %d\n", x, y);
} else {
printf("%d <= %d\n", x, y);
}
return 0;
}
Compilation với GCC 4.2.1 như sau sản xuất không có đầu ra trên console:
gcc -Werror -Wall -Wextra -pedantic foo.c -o foo
Kết quả là thực thi tạo đầu ra sau đây:
$ ./foo
20 <= -30
Is có một số lý do mà GCC không tạo ra bất kỳ cảnh báo hoặc thông báo lỗi nào khi gán giá trị đã ký -30
cho biến số nguyên không dấu y
?
Lưu ý rằng bạn nên sử dụng% u để in 'unsigned int'. –
@ Bastien, thực sự; có lẽ thú vị hơn là, như AndreyT đã chỉ ra trong câu trả lời của mình dưới đây, 'printf ("% d ")' cho thấy giá trị đã ký thay vì giá trị chưa ký (4294967266) được sử dụng bởi toán tử so sánh! – maerics
Đó là do biểu diễn bổ sung 2 của int đã ký: http://en.wikipedia.org/wiki/Two%27s_complement (biểu diễn này không được đảm bảo bởi tiêu chuẩn C, nhưng trong thực tế tôi chưa bao giờ nghe nói về một biểu diễn khác vẫn đang được sử dụng) –