Opération de comparaison sur non signés et les entiers signés

Voir cet extrait de code

int main()
{ 
 unsigned int a = 1000;
 int b = -1;
 if (a>b) printf("A is BIG! %d\n", a-b);
 else printf("a is SMALL! %d\n", a-b); 
 return 0;
}   

Cela donne à la sortie: un est PETIT: 1001

Je ne comprends pas ce qui se passe ici. Comment l' > opérateur de travailler ici? Pourquoi est-ce "un" plus petit que "b"? Si il est en effet plus petit, pourquoi dois-je obtenir un nombre positif (1001) comme la différence?

  • Si vous utilisez le Wsign-comparer compilateur drapeau, vous obtiendrez un avertissement pour la comparaison. Vous devriez toujours utiliser -Mur (qui comprend Wsign-comparer). Voir ici pour d'autres façons d'éviter ce problème.
  • Voir ce post pour plus d'info: stackoverflow.com/q/10474769/844882
  • techniquement ce n'est pas tout à fait droit, -Wsign-comparer n'est inc. avec -Mur si vous êtes à la compilation C++. Il n'est pas inclus pour C (voir ici gcc.gnu.org/onlinedocs/gcc/Warning-Options.html) je l'ai testé et je peux confirmer le code ci-dessus donne pas d'avertissement à -Mur, mais ne avec -Wsign-comparer (je suis en utilisant gcc (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010)
InformationsquelleAutor Gitmo | 2010-01-18