Khi so sánh có dấu với chưa có dấu, trình biên dịch chuyển đổi giá trị có dấu thành không dấu. Đối với sự bình đẳng, điều này không quan trọng -1 == (unsigned) -1
,. Để so sánh khác, nó quan trọng, ví dụ sau đây là đúng: -1 > 2U
.
CHỈNH SỬA: Tài liệu tham khảo:
5/9: (Biểu thức)
Nhiều toán tử nhị phân mong đợi các toán hạng của kiểu số học hoặc kiểu liệt kê gây ra chuyển đổi và mang lại các kiểu kết quả theo cách tương tự. Mục đích là mang lại một kiểu chung, cũng là kiểu kết quả. Mẫu này được gọi là các 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 thuộc loại kép dài, toán hạng kia sẽ được chuyển thành kép dài.
Ngược lại, nếu một trong hai toán hạng là gấp đôi, toán hạng kia sẽ được chuyển thành kép.
Ngược lại, nếu một trong hai toán hạng là float, thì toán hạng còn lại sẽ được chuyển thành float.
Nếu không, các thăng hạng tích hợp (4.5) sẽ được thực hiện trên cả hai toán hạng.54)
Sau đó, nếu một trong hai toán hạng không có dấu dài thì toán hạng kia sẽ được chuyển thành dài không dấu.
Ngược lại, nếu một toán hạng là một int dài và một int không dấu khác, thì nếu một int dài có thể đại diện cho tất cả các giá trị của một int không dấu, int unsigned sẽ được chuyển thành một int dài; nếu không thì cả hai toán hạng sẽ được chuyển đổi thành int dài không dấu.
Ngược lại, nếu một trong hai toán hạng là dài, toán hạng kia sẽ được chuyển thành dài.
Ngược lại, nếu một trong hai toán hạng không có dấu, toán hạng kia sẽ được chuyển thành không dấu.
4,7 / 2: (Chuyển đổi tích phân)
Nếu kiểu đích là không dấu, giá trị kết quả là số nguyên không dấu nhỏ nhất tương ứng với số nguyên nguồn (modulo 2 n trong đó n là số bit được sử dụng để biểu thị kiểu không dấu). [Lưu ý: Trong biểu diễn bổ sung của một hai, chuyển đổi này là khái niệm và không có thay đổi trong mẫu bit (nếu không có sự cắt bớt). ]
EDIT2: Mức cảnh báo MSVC
Tất nhiên, những gì được cảnh báo về các mức cảnh báo khác nhau của MSVC là do các nhà phát triển lựa chọn. Như tôi thấy, lựa chọn của họ liên quan đến bình đẳng có dấu / không dấu so với so sánh lớn hơn / ít hơn có ý nghĩa, điều này tất nhiên là hoàn toàn chủ quan:
-1 == -1
có nghĩa giống như -1 == (unsigned) -1
- Tôi thấy đó là một kết quả trực quan.
-1 < 2
không có nghĩa giống như -1 < (unsigned) 2
- Thoạt nhìn, điều này ít trực quan hơn và IMO xứng đáng được cảnh báo "sớm hơn".