2016-09-20 5 views
3

in C++, ich den folgenden Code haben:Warum erzeugt das Maskieren einer negativen Zahl eine positive Zahl?

int x = -3; 
x &= 0xffff; 
cout << x; 

Dies erzeugt

65533 

Aber wenn ich die negative entfernen, so habe ich dies:

int x = 3; 
x &= 0xffff; 
cout << x; 

ich einfach 3 als Ergebnis

Warum das erste Ergebnis nicht eine negative Zahl erzeugen? Ich würde erwarten, dass -3 Zeichen auf 16 Bits erweitert werden würde, was immer noch eine zweifache negative Komplementärzahl ergeben sollte, wenn man bedenkt, dass all diese erweiterten Bits 1 wären. Folglich wäre das höchstwertige Bit auch 1.

Antwort

5

Es sieht so aus, als ob Ihr System 32-Bit int s mit Zweierkomplement-Darstellung von Negativen verwendet.

Konstante 0xFFFF umfasst die niederwertigsten zwei Bytes, wobei die oberen beiden Bytes Null sind.

Der Wert von -3 ist 0xFFFFFFFD, so Maskierung es mit 0x0000FFFF Sie erhalten 0x0000FFFD oder 65533 in dezimal.

Positiv 3 ist 0x00000003, so Maskierung mit 0x0000FFFF gibt Ihnen 3 zurück.

Sie würden das Ergebnis erhalten, das Sie erwarten, wenn Sie einen 16-Bit-Datentyp angeben, z.

int16_t x = -3; 
x &= 0xffff; 
cout << x; 
+0

könnten Sie erklären, warum 0xFFFD nicht mehr in Zweierkomplementform ist? – Dillydill123

+0

@ Dillydill123, weil die oberen 2 Bytes von 0xffff 0 sind. Versuchen Sie, eine 32-Bit-Maske (d. H. 0xffffffff) zu verwenden, und es sollte das Vorzeichen beibehalten. – sashang

+0

Macht Sinn! danke – Dillydill123

0

In Ihrem Fall ist int mehr als 2 Bytes. Sie laufen wahrscheinlich auf modernen CPU wo normalerweise diese Tage Integer ist 4 Bytes (oder 32 Bits)

Wenn Sie einen Blick auf die Art, wie System speichert negative Zahlen Sie sehen, dass es eine komplementäre Nummer. Und wenn Sie nur die letzten 2 Bytes nehmen, da Ihre Maske 0xFFFF ist, dann erhalten Sie nur einen Teil davon.

Ihre 2 Möglichkeiten:

  1. Verwendung kurzes intstead von int. Normalerweise ist die eine Hälfte der ganzen Zahl und nur 2 Bisse
  2. verwenden größere Maske wie 0xFFFFFFFF sein, dass es deckt alle Bits Ihrer integer

HINWEIS: Ich benutze „in der Regel“, weil die Menge an Bits in Ihrem int und kurz hängt von Ihrer CPU und Compiler ab.

Verwandte Themen