Давайте пройдемся по коду:
short a = -5;
а = -5, которая вписывается в короткий. До сих пор так легко.
unsigned short b = -5u;
-5u средства применять унарный -
оператора к постоянному 5U. 5u is (unsigned int) 5, а унарный -
не продвигает рекламу, поэтому вы получаете 4294967291, что составляет 2^32-5. (Обновление: я ошибся в своем первоначальном ответе, см. Тестовый скрипт, который показывает, что эта версия верна здесь http://codepad.org/hjooaQFW)
Теперь, когда он помещается в b, он усекается беззнаковым коротким (обычно 2 байта) , поэтому b = 65531, что составляет 2^16-5.
if(a == b)
В этой строке a и b повышаются до значений, чтобы сравнение могло происходить правильно. Если бы они были повышены до шорт, b потенциально обернулся бы. Если бы они были переведены на беззнаковые шорты, они потенциально обернутся.
Это как сказать if((int) a == (int) b)
. И a = -5, поэтому (int) a = -5 и b = 65531, поэтому (int) b = 65531, потому что ints больше шорт.
какой компилятор вы используете? – 2013-03-06 19:06:46
[this] (http://en.cppreference.com/w/cpp/language/implicit_cast) может быть полезным. – juanchopanza
Целое продвижение происходит только в выражении 'a == b' - это все, о чем вы спрашиваете? –