2017-10-02 6 views
-2

Ich habe ein Stück Code:Einerkomplement ~ Operator in c kippt Bits nicht korrekt?

#include <stdio.h> 

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

wenn unärer Operator ~ alle Bits Flips, ~i sollte 0b11111101 gleich sein, die -125 ist, aber mein Code gibt mir Ausgabe von -3 in binärer die 0b00000011 ist. Kann mir jemand erklären warum?

+4

'11111101' ist' -3' –

+1

Bitte lesen Sie auch über zwei ergänzen. – taskinoor

+0

Es funktioniert gut – RSon1234

Antwort

4

two's complement negative Zahlen darzustellen Unter der Annahme, (das ist, was Ihre Maschine verwendet höchstwahrscheinlich):

0b11111101 ist -3, nicht -125.

0b10000011 wäre -125 während 0b00000011 würde 3. sein

Sie scheinen sign-magnitude werden unter der Annahme, was sehr ungewöhnlich ist.

Der Operator ~ dreht alle Bits um, aber was diese Bits für negative Zahlen bedeuten, hängt von Ihrem System ab. C erlaubt drei verschiedene Darstellungen: Vorzeichengröße, ones' complement und Zweierkomplement. In der Praxis wird fast immer Zweierkomplement verwendet.


Auch C kann auf char s nicht wirklich funktionieren. Wenn Sie versuchen, einen char Wert in einem Ausdruck zu verwenden, wird es zunächst zu int heraufgestuft. Also, was in ~i eigentlich los ist ist:

  • Der Wert von i gelesen (char 2).
  • Es wird in int (int 2) konvertiert.
  • Alle Bits werden gewendet (int0b1111111....111101, abhängig davon, wie viele Bits Ihre int s haben (normalerweise 32 oder 64)).
  • Die Bits werden entsprechend der Zweierkomplementdarstellung entsprechend -3 interpretiert.

In diesem Fall ist das Ergebnis das gleiche, als wenn Sie den Vorgang zunächst auf char getan haben, konvertierten dann das Ergebnis zu int, so dass es keinen Unterschied macht, aber das ist, wie C es tut.

+0

Es sollte auch erwähnt werden, dass in "~ i", "i" zu "int" befördert wird 'zuerst –

+0

habe es, danke! –