137 votes

Pourquoi fait ~ vrai résultat en -2 ?

Dans la console Python :

Me donne :

Pourquoi ? Quelqu'un peut-il expliquer ce cas particulier m’en binaire ?

245voto

Maroun Maroun Points 31217

Qu'est - int(True)? C'est - 1.

Qu'est - 1? C'est:

00000001

Qu'est - ~1? C'est:

11111110

Qui est - -2 (complément à Deux)1

1 Flip tous les morceaux, ajouter 1 au nombre obtenu et interpréter le résultat comme une représentation binaire de l'ampleur et de l'ajout d'un signe négatif (puisque le nombre commence par 1):

11111110 → 00000001 → 00000010 
         ↑          ↑ 
       Flip       Add 1

Qui est de 2, mais le signe est négatif depuis le MSB est de 1.

45voto

Martijn Pieters Points 271458

Le Python bool type est une sous-classe de int (pour des raisons historiques; les booléens ont été ajoutées en Python 2.3).

Depuis int(True) est 1, ~True est ~1 est -2.

Voir PEP 285 pourquoi bool est une sous-classe de int.

Si vous voulez que le booléen inverse, utiliser not:

>>> not True
False
>>> not False
True

Si vous avez voulu savoir pourquoi ~1 est -2, c'est parce que vous êtes en inversant tous les bits d'un entier signé; 00000001 devient 1111110 qui en a signé nombre entier est un nombre négatif, voir en complément à Deux:

>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'

lorsque la première 1 bits signifie que la valeur est négative, et le reste des bits codent l'inverse du nombre positif, moins un.

4voto

Wolf Points 1039

~True == -2 est pas surprenant si l' True moyen 1 et ~ moyen au niveau du bit d'inversion...

...à condition que

  • True peut être considérée comme un entier et
  • les entiers sont représentés en complément à Deux

Modifications:

  • fixe le mélange entre la représentation entière et au niveau du bit d'inversion de l'opérateur
  • appliquer une autre polissage (les messages les plus courts, plus le travail nécessaire)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X