Dupliquer possible:
Comparaison non signée et signée
Comparaison entre caractères non signés et signés
J’ai un comportement étrange lorsque j’essaie d’entrer dans cette déclaration while:
unsigned u = 0; int i = -2; while(i < u) { // Do something i++; }
Mais il n’entre jamais, même si je mets un sharepoint rupture i = -2
et u = 0
. Qu’est-ce que je fais mal? Comment pourrais-je résoudre ce problème?
C’est parce que la norme ANSI C définit que chaque fois qu’il y a une comparaison entre un type qualifié (votre unsigned int u
) et un type non qualifié (votre unsigned int u
), le type non qualifié est promu vers un type du même type (donc toujours ), mais hérite également des qualificateurs de l’autre quantité (c’est-à-dire qu’elle devient unsigned
).
Lorsque votre int
, dont la valeur est égale à -2
, devient unsigned
le premier octet subit cette transformation: 0000 0010 -> 1111 1110
. Votre int
est maintenant un très grand nombre positif, certainement plus grand que votre unsigned int
.
Il y a une solution: cast to signed
while(i < (signed) u) { // Do something i++; }
En passant, votre compilateur devrait probablement vous avertir.
Vous comparez un entier signé et non signé et vos problèmes ont commencé là-bas …
Ne faites pas ça et ça devrait marcher.