Les conversions de type sont cachés:
signed short z = (signed short) (((unsigned int) x)/y);
Lorsque vous mélangez types signés et non signés ceux non signés gagner. x
est convertie en unsigned int
, divisé par 3, puis ce résultat est converti à (signé) short
. Avec des entiers 32 bits:
(unsigned) -13701 == (unsigned) 0xFFFFCA7B // Bit pattern
(unsigned) 0xFFFFCA7B == (unsigned) 4294953595 // Re-interpret as unsigned
(unsigned) 4294953595/3 == (unsigned) 1431651198 // Divide by 3
(unsigned) 1431651198 == (unsigned) 0x5555437E // Bit pattern of that result
(short) 0x5555437E == (short) 0x437E // Strip high 16 bits
(short) 0x437E == (short) 17278 // Re-interpret as short
Par ailleurs, le mot-clé signed
est inutile. signed short
est un moyen plus long de dire short
. Le seul type qui nécessite explicitement signed
est char
. char
peut être signé ou non signé selon la plate-forme; tous les autres types sont toujours signés par défaut.
Il est peut-être intéressant de noter que dans le cas général, la conversion * non signé * n'est pas basée sur une réinterprétation. En fait, la conversion et la ré-interprétation sont des choses très, très, très différentes, et ce que nous avons dans ce cas est en fait une * conversion *, pas une réinterprétation. – AnT
++, bonne réponse –