Hãy xem qua mã của bạn:
short a = -5;
a = -5, mà phù hợp với một đoạn ngắn. Cho đến nay rất dễ dàng.
unsigned short b = -5u;
-5u nghĩa là áp dụng toán tử đơn nhất -
cho hằng số 5u. 5u là (unsigned int) 5, và unary -
không có quảng cáo, vì vậy bạn kết thúc với 4294967291 là 2^32-5. (Cập nhật: Tôi đã sai một chút trong câu trả lời ban đầu của tôi; xem một kịch bản thử nghiệm cho thấy phiên bản này là chính xác tại đây http://codepad.org/hjooaQFW)
Bây giờ khi đặt nó vào b, nó được cắt ngắn thành một dấu ngắn (2 byte, thường) , vì vậy b = 65531, là 2^16-5.
if(a == b)
Trong dòng này, a và b đều được quảng bá để ints để so sánh có thể xảy ra chính xác. Nếu chúng được quảng bá cho quần short, b sẽ có khả năng quấn quanh. Nếu chúng được quảng cáo cho quần short không dấu, một khả năng sẽ quấn quanh.
Vì vậy, nó giống như nói if((int) a == (int) b)
. Và a = -5, do đó (int) a = -5, và b = 65531, vì vậy (int) b = 65531, bởi vì ints lớn hơn quần short.
trình biên dịch nào bạn đang sử dụng? –
[this] (http://en.cppreference.com/w/cpp/language/implicit_cast) có thể hữu ích. – juanchopanza
Việc thăng hạng số nguyên chỉ xảy ra trong biểu thức 'a == b' ở đó - là tất cả những gì bạn đang hỏi? –