Binärarithmetik & Zweierkomplement-Labor

Visualisiere Bit-Wertigkeiten, untersuche vorzeichenbehaftete Darstellungen und rechne binär spaltenweise.

Interaktive Simulation wird geladen...

Ein Addierer erledigt auch die Subtraktion 🖖

In modernen Computern werden negative Ganzzahlen mit dem Zweierkomplement dargestellt. Das höchstwertige Bit (MSB) fungiert als negatives Gewicht: Bei 8-Bit-Ganzzahlen repräsentiert Bit 7 -128 statt +128. Dies hat eine elegante Eigenschaft: Subtraktion ist identisch mit Addition. Die CPU berechnet A - B als A + (~B + 1), eliminiert so separate Subtraktionshardware und ermöglicht der ALU, dieselben Addier-Schaltkreise für beide Operationen zu verwenden.

Binär ist Stellenwert zur Basis 2 🖖

In Alltagszahlen ist jede Spalte zehnmal so viel wert wie die rechts daneben; im Binärsystem ist der Faktor einfach 2. Die Bits tragen (von rechts) die Wertigkeiten 1, 2, 4, 8, 16, 32, … Eine Binärzahl liest man, indem man die Wertigkeiten dort addiert, wo eine 1 steht: 1011 ist 8 + 0 + 2 + 1 = 11. Die Bit-Wertigkeitsanzeige des Tools lässt dich jedes Bit umschalten und die laufende Summe beobachten — das ist das Geheimnis hinter jeder Umrechnung hier.

Dein Prozessor multipliziert wie ein russischer Bauer 🖖

Die hier gezeigte schriftliche Multiplikation — A verdoppeln und überall dort addieren, wo B ein 1-Bit hat — ist genau die „russische Bauernmultiplikation", ein Verfahren, das schon vor über 3000 Jahren auf ägyptischen Papyri auftaucht. Man halbiert die eine Zahl (Reste verwerfen) und verdoppelt die andere, dann summiert man die verdoppelten Werte, wo die halbierte Zahl ungerade ist. Halbieren und auf Ungeradheit prüfen heißt nichts anderes als Binärziffern ablesen — ein antiker Schreiber und eine moderne ALU führen denselben Algorithmus aus.

ACHT BITS, VIER BEDEUTUNGEN — WELCHE CODIERUNG LIEST DU?

In welcher Binärcodierung bist du?

Ein Byte verrät nicht, wie es zu lesen ist. Das Muster 11010110 ist 214 oder −42 oder −41 oder −86, je nach einer vorher verabredeten Konvention — und die Bits selbst können dir nicht sagen, welche gilt. Wählst du falsch, ist jeder weitere Schritt falsch, und jeder weitere Schritt sieht dabei richtig aus. Die erste Frage lautet also nie, wie das Ergebnis heißt, sondern was das oberste Bit wiegt. Die vier Codierungen unten antworten darauf auf vier Weisen; die letzten beiden Fälle zeigen, warum eine davon die Hardware gewonnen hat.

Vorzeichenlos — jede Spalte addiert w₇ = +128 → 0…255
Zweierkomplement — das oberste Bit schuldet dir 128 w₇ = −128 → −128…127
Einerkomplement — negieren durch Umkippen jedes Bits w₇ = −127, 0 = ±0
Betrag und Vorzeichen — das Bit, das keine Zahl ist w₇ = ±, 0 = ±0
Subtraktion ohne Subtrahierwerk a − b = a + (¬b + 1)
Multiplizieren durch Schieben und Addieren a × b = ∑ (a ≪ i)

01

Vorzeichenlos — jede Spalte addiert

Was du weißt: Alle acht Gewichte sind positive Zweierpotenzen, von 1 bis 128. Nichts codiert ein Vorzeichen, also kann nichts negativ sein: der Bereich ist 0 bis 255, und alle 256 Muster sind in Gebrauch.

Woran du es abliest: w₇ = +128 → 0…255

Rechenbeispiel: 85 + 11 → 01010101 + 00001011 = 01100000 = 96, wobei die Überträge aus den niedrigen Spalten nach oben wandern. Treibe es weiter, und 214 + 100 ergibt in acht Bit 58 — die wahren 314 minus 256, wobei die fehlende 1 im Übertrag hängt.

Diesen Fall öffnen: Vorzeichenlos addieren
Vorzeichenlos — jede Spalte addiert. Alle Gewichte positiv: die acht Spalten addieren einfach, 0 bis 255. Alle acht Gewichte sind positive Zweierpotenzen, von 1 bis 128. Nichts codiert ein Vorzeichen, also kann nichts negativ sein: der Bereich ist 0 bis 255, und alle 256 Muster sind in Gebrauch.
Alle Gewichte positiv: die acht Spalten addieren einfach, 0 bis 255.

02

Zweierkomplement — das oberste Bit schuldet dir 128

Was du weißt: Sieben positive Gewichte und ein negatives: Bit 7 zählt −128 statt +128. Sonst ändert sich nichts, und der Bereich verschiebt sich auf −128 bis 127.

Woran du es abliest: w₇ = −128 → −128…127

Rechenbeispiel: 11010110 ergibt −128 + 64 + 16 + 4 + 2 = −42. Addiere 10 (00001010) mit gewöhnlicher Spaltenaddition, und du erhältst 11100000 = −128 + 64 + 32 = −32. Genau dieselben acht Bit sind im vorzeichenlosen Modus 214.

Diesen Fall öffnen: Zweierkomplement
Zweierkomplement — das oberste Bit schuldet dir 128. Bit 7 wiegt −128, also ist 11010110 gleich −42 — die Bits, die vorzeichenlos 214 heißen. Sieben positive Gewichte und ein negatives: Bit 7 zählt −128 statt +128. Sonst ändert sich nichts, und der Bereich verschiebt sich auf −128 bis 127.
Bit 7 wiegt −128, also ist 11010110 gleich −42 — die Bits, die vorzeichenlos 214 heißen.

03

Einerkomplement — negieren durch Umkippen jedes Bits

Was du weißt: Bit 7 wiegt −127. Eine negative Zahl ist das bitweise Gegenteil ihres Betrags, also ist −42 gleich 11010101 und nicht 11010110, und der Bereich ist symmetrisch: −127 bis 127.

Woran du es abliest: w₇ = −127, 0 = ±0

Rechenbeispiel: −42 ist 11010101, das Gegenteil von 00101010. Addiert man 10, ergibt sich 11011111 = −127 + 64 + 16 + 8 + 4 + 2 + 1 = −32, und das stimmt hier nur, weil aus der obersten Spalte nichts hinausgetragen wurde. Versuche stattdessen −42 + 50: die reine Summe liest sich als 7, um eins zu klein, und der Übertrag muss unten wieder hineingegeben werden, um auf 8 zu kommen.

Diesen Fall öffnen: Einerkomplement
Einerkomplement — negieren durch Umkippen jedes Bits. −42 ist einfach 42 umgekippt, und 11111111 ist eine zweite, negative Null. Bit 7 wiegt −127. Eine negative Zahl ist das bitweise Gegenteil ihres Betrags, also ist −42 gleich 11010101 und nicht 11010110, und der Bereich ist symmetrisch: −127 bis 127.
−42 ist einfach 42 umgekippt, und 11111111 ist eine zweite, negative Null.

04

Betrag und Vorzeichen — das Bit, das keine Zahl ist

Was du weißt: Bit 7 ist ein reines Kennzeichen ohne jedes Gewicht: 0 heißt positiv, 1 heißt negativ, und die unteren sieben Bit tragen einen gewöhnlichen Betrag von 0 bis 127.

Woran du es abliest: w₇ = ±, 0 = ±0

Rechenbeispiel: −42 ist 10101010: das Vorzeichenbit gesetzt, dahinter 42 als 0101010. So schreiben Menschen Zahlen, und es ist die eine der vier Codierungen, bei der es einfach falsch ist, beide Operanden an ein gewöhnliches Addierwerk zu geben — 10101010 + 00001010 ergibt 10110100, und das bedeutet −52 und nicht −32.

Diesen Fall öffnen: Betrag und Vorzeichen
Betrag und Vorzeichen — das Bit, das keine Zahl ist. Das Vorzeichenbit trägt kein Gewicht — und ein gewöhnliches Addierwerk liefert −52 statt −32. Bit 7 ist ein reines Kennzeichen ohne jedes Gewicht: 0 heißt positiv, 1 heißt negativ, und die unteren sieben Bit tragen einen gewöhnlichen Betrag von 0 bis 127.
Das Vorzeichenbit trägt kein Gewicht — und ein gewöhnliches Addierwerk liefert −52 statt −32.

05

Subtraktion ohne Subtrahierwerk

Was du weißt: Zweierkomplement, Operation auf Subtraktion gestellt. Die Hardware besitzt keine Subtraktionsschaltung: sie negiert den zweiten Operanden und addiert.

Woran du es abliest: a − b = a + (¬b + 1)

Rechenbeispiel: 42 − 58 → 00111010 umkippen zu 11000101, 1 addieren ergibt 11000110, und das ist −58. Nun 00101010 dazu addieren: 11110000, und das bedeutet −128 + 64 + 32 + 16 = −16.

Diesen Fall öffnen: Subtrahieren durch Addieren
Subtraktion ohne Subtrahierwerk. Umkippen, eins addieren, dann addieren: 42 + (−58) landet auf −16. Zweierkomplement, Operation auf Subtraktion gestellt. Die Hardware besitzt keine Subtraktionsschaltung: sie negiert den zweiten Operanden und addiert.
Umkippen, eins addieren, dann addieren: 42 + (−58) landet auf −16.

06

Multiplizieren durch Schieben und Addieren

Was du weißt: Vorzeichenloser Modus, Operation auf Multiplikation gestellt. Jedes 1-Bit im zweiten Operanden trägt eine Kopie des ersten bei, nach links verschoben um die Stelle dieses Bits.

Woran du es abliest: a × b = ∑ (a ≪ i)

Rechenbeispiel: 13 × 5 → die 5 ist 00000101, also sind Bit 0 und Bit 2 gesetzt. Das trägt 13 ungeschoben bei (00001101 = 13) plus 13 um zwei Stellen geschoben (00110100 = 52), und 13 + 52 = 65 = 01000001.

Diesen Fall öffnen: Schieben und addieren
Multiplizieren durch Schieben und Addieren. Bei der 5 sind Bit 0 und 2 gesetzt, also zählen nur die Zeilen 13 und 52. Vorzeichenloser Modus, Operation auf Multiplikation gestellt. Jedes 1-Bit im zweiten Operanden trägt eine Kopie des ersten bei, nach links verschoben um die Stelle dieses Bits.
Bei der 5 sind Bit 0 und 2 gesetzt, also zählen nur die Zeilen 13 und 52.

Aufgabe vollständig gelöst

  1. Zwei separate Überlauf-Flags für 42 konvertiert in acht Bit 6 Schritte

    Wandeln Sie 42 auf zwei verschiedene Arten in acht Bit um und finden Sie dann heraus, warum eine CPU zwei getrennte Überlauf-Flags besitzt, obwohl sie nur einen Addierer hat.

    1. Das Stellenwertsystem ist eine Summe von Potenzen; der direkte Weg besteht also darin, herauszufinden, welche Zweierpotenzen enthalten sind. Drei davon, und das Bitmuster ergibt sich von selbst.

    2. Der mechanische Weg liefert ohne jedes Suchen dasselbe Ergebnis. Dividiert man wiederholt durch zwei, sind die Reste die Bits, das niederwertigste zuerst — man liest die Spalte von unten nach oben.

    3. Die Negation im Zweierkomplement ist Invertieren und anschließendes Inkrementieren, und das Ergebnis ist gleich 256 − 42. Das ist schon der ganze Trick: Arithmetik modulo 256, wobei die obere Hälfte als negativ umdefiniert wird.

    4. Nun zu den Flags. Ein Übertrag nach außen ist eine Eigenschaft der höchsten Bitposition; ein Überlauf ist eine Nichtübereinstimmung zwischen dem Übertrag in das Vorzeichenbit und dem Übertrag aus ihm heraus.

    5. Betrachten wir ein Paar, bei dem die beiden Flags nicht übereinstimmen. Kein Übertrag verlässt das Byte, daher ist die vorzeichenlose Arithmetik korrekt, aber das Vorzeichenbit hat sich umgekehrt — das vorzeichenbehaftete Ergebnis ist um 256 falsch.

    6. Kehrt man dies mit einem Paar um, das einen Übertrag erzeugt, aber keinen Überlauf, ist der Fall für zwei Flags abgeschlossen.

    Antwort

    Weil dieselben Bits zwei verschiedene Zahlen bedeuten und nur der Programmierer weiß, welche. 0110 0100 + 0011 0010 = 1001 0110 erzeugt keinen Übertrag aus Bit 7, sodass C = 0 ist und eine vorzeichenlose Interpretation von 100 + 50 = 150 vollkommen korrekt ist. Liest man dasselbe Ergebnis im Zweierkomplement, entspricht es −106, was Unsinn ist, und V = 1 meldet dies. Addiert man stattdessen 200 + 100, tauschen die Flags: C = 1, V = 0. Der Addierer weiß es nicht und kümmert sich nicht darum — er berechnet eine Summe und löst beide Alarme aus, und der Befehl, den der Compiler danach auswählt, entscheidet, welcher davon ein Fehler ist. Deshalb belassen C und C++ den vorzeichenbehafteten Überlauf undefiniert und definieren den vorzeichenlosen Überlauf: Die Hardware unterscheidet zwischen beiden, und die Sprache hat sich entschieden, dies offenzulegen.

Quellen (1)

Beispielaufgaben

  • Vorzeichenlos addieren - 85 + 11 in Binärform, mit Übertrag durch die Spalten.
  • Zweierkomplement - Zweierkomplement: 11010110 bedeutet −42, und −42 + 10 = −32.
  • Einerkomplement - Einerkomplement: das oberste Bit wiegt −127, also ist −42 gleich 11010101.
  • Betrag und Vorzeichen - Betrag und Vorzeichen: das oberste Bit ist reines Vorzeichen, also ist −42 gleich 10101010.
  • Subtrahieren durch Addieren - 42 − 58 = −16 zeigt, wie Subtraktion über das negative Gewicht des obersten Bits zur Addition wird.
  • Schieben und addieren - 13 × 5 = 65 über Schieben und Addieren in binärer schriftlicher Multiplikation.