2017-10-02 2 views
-2

J'ai un morceau de code:son complément ~ l'opérateur dans c ne retourne pas les bits correctement?

#include <stdio.h> 

int main() { 
    char i = 0b00000010; //2 
    printf("%d", ~i); 
} 

si l'opérateur unaire ~ retourne tous les bits, ~i doit être égale à 0b11111101 qui est -125, mais mon code me donne une sortie de -3 qui en binaire est 0b00000011. Quelqu'un peut-il m'expliquer pourquoi?

+4

'11111101' est' -3' –

+1

Veuillez également vous renseigner sur le complément à deux. – taskinoor

+0

Cela fonctionne très bien – RSon1234

Répondre

4

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 (int0b1111111....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.

+0

Il faut aussi mentionner que dans '~ i',' i' est promu 'int 'premier –

+0

l'ai eu, merci! –