Chris a écrit :Normalement, si on fait ce code:
Code : Tout sélectionner
Debug ~1 ; devrait retourner 0
Debug ~0 ; devrait retourner 1
on devrait obtenir 0 pour le premier, et 1 pour le second, puisque l'aide dit ceci:
NOT est une inversion logique (binaire)... blablabla...
RHS |Résultat
----------
0 | 1
1 | 0
ce qui est confirmé par les différents sites que j'ai visité.
Alors pourquoi ça me donne respectivement -2 et -1 ???
Chris

Qui a écrit que ~0 = 1 etc ?
Hardy a raison.
Dans ton exemple c'est un long, mais le raisonnement vaut pour un word byte etc.
La doc PB dit que c'est une inversion bit à bit et il faut garder à l'esprit que tous les nombres gérés par PB (à l'heure actuelle) sont des nombres signés donc un long (32 bits) va de -2147483648 à +2147483647 , l'information sur le signe est contenue dans le nombre lui-même.
Pour ne pas se tromper, il faut passer par la représentation binaire (ou hexa pour ceux qui préfèrent) des nombres.
0 (en 32 bits) --> 00000000 00000000 00000000 00000000
et
1 (en 32 bits) --> 00000000 00000000 00000000 00000001
Le bit b0 (le + à droite) vaut 2 puissance 0 soit 1 multiplié par 1 (car le bit est à 1, si le bit avait été à 0 on multipliait par 0) puisque tout nombre élevé à la puissance 0 vaut 1.
bit b 31 --> 00000000 00000000 00000000 00000001 <-- bit B0
La solution pour stocker le signe est l'utilisation du bit b31 comme bit de signe
0 c'est un positif et 1 c'est un nombre négatif.
Donc pour trouver un nombre négatif à partir du nombre positif, on inverse bit à bit et on ajoute 1 et réciproquement
par exemple le nombre 20
0001 0100 (+20)
on inverse bit à bit
1110 1011
on ajoute 1
1110 1100 (-20) ; le dernier bit à gauche vaut 1 c'est donc un nombre négatif.
Il s'agit du complément à deux qui est utilisé pour les calcul des entiers signés.
Reprenons ton exemple
Debug ~1 ; devrait retourner 0
Debug ~0 ; devrait retourner 1
1 en 32 bit
00000000 00000000 00000000 00000001
On inverse bit à bit
11111111 11111111 11111111 11111110
on a donc bien un nombre négatif puisque le bit le plus à gauche vaut 1 et Pb ne travaille que sur les nombres signés
Ce nouveau nombre vaut -2
Pourquoi ?
Et bien on applique la règle du complément à 2 qui permet de trouver la valeur signée des nombres :
11111111 11111111 11111111 11111110
on inverse
00000000 00000000 00000000 00000001 ( = 1)
on ajoute 1
00000000 00000000 00000000 00000010 ( = 2)
donc le nombre
11111111 11111111 11111111 11111110
vaut - 2