Camminiamo attraverso il tuo codice:
short a = -5;
a = -5, che si inserisce in una breve. Fin qui tutto bene.
unsigned short b = -5u;
mezzi -5u applicare il -
operatore unario al 5u costante. 5u è (unsigned int) 5 e lo unario -
non fa promozione, quindi si finisce con 4294967291 che è 2^32-5. (Aggiornamento: ho sbagliato questo bit nella mia risposta originale, vedere uno script di prova che mostra questa versione è corretta qui http://codepad.org/hjooaQFW)
Ora quando lo si inserisce in b, viene troncato a un corto senza segno (2 byte, di solito) , quindi b = 65531, che è 2^16-5.
if(a == b)
In questa riga, aeb sono entrambi promossi in pollici in modo che il confronto possa avvenire correttamente. Se fossero promossi in cortometraggi, b sarebbe potenzialmente avvolgente. Se fossero promossi a cortometraggi non firmati, si sarebbero potenzialmente avvolti.
Quindi è come dire if((int) a == (int) b)
. E a = -5, quindi (int) a = -5, e b = 65531, quindi (int) b = 65531, perché le inte sono più grandi dei cortometraggi.
quale compilatore stai usando? –
[questo] (http://en.cppreference.com/w/cpp/language/implicit_cast) potrebbe essere utile. – juanchopanza
La promozione di interi ha luogo solo nell'espressione 'a == b' - è tutto quello che stai chiedendo? –