En supposant two's complement pour représenter des nombres négatifs (ce qui est ce que votre machine utilise le plus probable):
0b11111101
est -3, et non -125.
0b10000011
serait -125 alors que 0b00000011
serait 3.
Vous semblez supposer sign-magnitude, ce qui est très rare.
L'opérateur ~
retourne tous les bits, mais la signification de ces bits pour les nombres négatifs dépend de votre système. C permet trois représentations différentes: l'amplitude du signe, ones' complement, et le complément à deux. En pratique, le complément à deux est presque toujours utilisé.
En outre, C ne peut pas vraiment fonctionner sur char
s. Lorsque vous essayez d'utiliser une valeur char
dans une expression, il est d'abord promu int
. Alors qu'est-ce qui se passe réellement dans ~i
est:
- La valeur de
i
est lu (char
2). Il est converti en int
(int
2).
- Tous les bits sont inversés (
int
0b1111111....111101
, en fonction du nombre de bits de vos int
s (généralement 32 ou 64)).
- Les bits sont interprétés selon la représentation du complément à deux, correspondant à -3.
Dans ce cas, le résultat est le même que si vous aviez fait l'opération sur char
d'abord, puis converti le résultat à int
, il ne fait aucune différence, mais comment C fait.
'11111101' est' -3' –
Veuillez également vous renseigner sur le complément à deux. – taskinoor
Cela fonctionne très bien – RSon1234