Zweierkomplement: Wie Computer negative Zahlen speichern
Kurz: Im Zweierkomplement wird eine negative Zahl durch Invertieren aller Bits und Addieren von 1 gebildet; so funktioniert Addition und Subtraktion mit demselben Rechenwerk.
Genauer: Computer kennen nur Bits. Für vorzeichenbehaftete ganze Zahlen (int) nutzen praktisch alle Systeme das Zweierkomplement. Es hat nur eine Null, und Addition funktioniert ohne Sonderfälle.
Im Detail
Regel und Beispiel (8 Bit)
Negieren: alle Bits invertieren und 1 addieren.
+5 = 0000 0101
invertiert = 1111 1010
+1 = 1111 1011 → -5
Das höchstwertige Bit (MSB) ist das Vorzeichenbit (0 = positiv, 1 = negativ). Wertebereich bei n Bit: −2^(n−1) bis 2^(n−1) − 1, bei 8 Bit also −128 bis +127, bei 16 Bit −32 768 bis 32 767, bei 32 Bit −2 147 483 648 bis 2 147 483 647.
Lesen einer Zahl
Ist das MSB 1, ist die Zahl negativ: Bits invertieren, 1 addieren, Ergebnis mit Minus lesen.
1111 1011 → invertiert 0000 0100 → +1 = 0000 0101 = 5 → also −5.
Alternativ: MSB hat das negative Gewicht −128: 1111 1011 = −128 + 64 + 32 + 16 + 8 + 2 + 1 = −5.
Rechnen
Subtraktion ist Addition der negierten Zahl: 7 − 5 = 7 + (−5):
0000 0111 (+7)
+1111 1011 (-5)
=1 0000 0010 → Übertrag wird verworfen → 0000 0010 = +2
Dasselbe Addierwerk genügt, deshalb nutzen es CPUs. Überlauf (Overflow): Passt das Ergebnis nicht in den Bereich (127 + 1 = −128 in 8 Bit), wechselt das Vorzeichen: ein typischer Fehler (Integer-Überlauf), der in Sicherheitslücken und Spielen (Zähler springt auf negativ) vorkommt.
Vergleich und Hinweise
- Vorzeichen-Betrag (ein Bit Vorzeichen + Betrag): zwei Nullen (+0, −0), kompliziertere Rechnung.
- Einerkomplement: nur invertieren; auch zwei Nullen.
- Zweierkomplement: eine Null, einfache Arithmetik: Standard.
- Unsigned (ohne Vorzeichen): 0 bis 2^n − 1.
- Gleitkommazahlen (IEEE 754) nutzen anderes Format (Vorzeichen, Exponent, Mantisse).
In der Prüfung: Schrittweise invertieren, +1 und Bereich beachten. Python hat unbegrenzt große
int, C/Java/C# feste Breiten (int32,long).
Siehe auch: Binär, dezimal, hexadezimal, Bitmasken, Gleitkommazahl