Omówmy kodzie:
short a = -5;
a = -5, który pasuje do krótkiego. Na razie tak łatwo.
unsigned short b = -5u;
-5u środki stosuje jednoargumentowy -
operatorowi stałej 5u. 5u to (unsigned int) 5, a unary -
nie ma promocji, więc kończy się 4294967291, czyli 2^32-5. (Aktualizacja: Trochę się myliłem w mojej oryginalnej odpowiedzi, zobacz skrypt testowy, który pokazuje, że ta wersja jest tutaj poprawna http://codepad.org/hjooaQFW)
Teraz, gdy wstawi się ją do pliku b, jest obcinana do niepodpisanego skrótu (zwykle 2 bajty) , więc b = 65531, czyli 2^16-5.
if(a == b)
W tym wierszu, aib są promowane do ints, więc porównanie może się odbyć poprawnie. Gdyby zostali promowani do szortów, b potencjalnie zawijałby się. Gdyby zostali awansowani do niepodpisanych krótkich spodenek, to potencjalnie zawijali.
To tak jakby powiedzieć: if((int) a == (int) b)
. I a = -5, więc (int) a = -5, i b = 65531, więc (int) b = 65531, ponieważ ints są większe niż szorty.
którego kompilatora używasz? –
[this] (http://en.cppreference.com/w/cpp/language/implicit_cast) może być przydatne. – juanchopanza
Integer promotion dzieje się tylko w wyrażeniu "a == b" - czy to wszystko, o co pytasz? –