Pourquoi unsigned int 0xFFFFFFFF est égal à int -1?

En C ou C++, il est dit que le nombre maximal d'un size_t (unsigned int type de données) peut tenir est la même que la coulée de -1 à ce type de données. voir, par exemple, Valeur non valide pour size_t

Pourquoi?

Je veux dire, (en parlant de 32 bits ints) autant que je sache, le bit le plus significatif détient le signe dans un type de données signées (qui est, peu 0x80000000 pour former un nombre négatif). alors, de 1 est 0 x 00000001.. 0x7FFFFFFFF est le plus grand nombre positif d'une donnée de type int peut tenir.

Puis, autant que je sache, la représentation binaire de -1 int doit être 0x80000001 (peut-être que je me trompe). pourquoi/comment cette valeur binaire est converti en quelque chose de complètement différent (0xFFFFFFFF) lors de la conversion d'entiers non signé?? ou.. comment est-il possible de former un binaire -1 de 0xFFFFFFFF?

Je n'ai aucun doute que, dans C: ((unsigned int)-1) == 0xFFFFFFFF ou ((int)0xFFFFFFFF) == -1 est tout aussi vrai que 1 + 1 == 2, je me demande pourquoi.

  • Lisez à propos de "complément à Deux" sur Wikipédia; c'est le moyen le plus commun de l'encodage des nombres négatifs en binaire.
  • en.wikipedia.org/wiki/Two%27s_complement
  • Vous remarquerez que, tout comme avec les nombres non signés, en ajoutant 1 au plus grand nombre possible vous donnera le plus bas possible.
  • La représentation binaire de négatifs que l'on a d'être que la représentation que les rendements de zéro quand on y est ajouté. C'est 0xFFFFFFFF.
InformationsquelleAutor conejoroy | 2009-12-07