Impossible d’entrer en tant que déclaration

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.