Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Negative Zahlen und Kommazahlen speichern

Nach dieser Lektion: Ich kann negative Zahlen und Kommazahlen als Bits speichern.

Lektion, 50 Min.7 BefehleLab für Compilerbau und Rechnerarchitektur: gcc, flex, bison und RISC-V in einer VM

Ein Video sprengt den Zähler

Im Jahr 2014 wurde ein Musikvideo auf YouTube über zwei Milliarden Mal angesehen. Der Zähler dafür hatte nur 32 Bits, und die größte Zahl darin war 2.147.483.647.

YouTube musste den Zähler vergrößern, bevor er überlief. Sonst wäre er plötzlich negativ geworden. Wie kann eine Zahl durch Zählen negativ werden? Das klärt diese Lektion.

Am Ende dieser Lektion

Notiz

Ich kann negative Zahlen und Kommazahlen als Bits speichern.

Schlüsselwörter

BegriffWas er bedeutet
Zweierkomplementdie übliche Art, negative ganze Zahlen in Bits zu speichern
Höchstwertiges Bitdas Bit ganz links, das am meisten wert ist
Überlaufein Ergebnis, das nicht mehr in seine Bits passt
Festkommaeine Zahl, deren Komma immer an derselben Stelle steht
Gleitkommaeine Zahl aus Ziffern und einer Potenz, die das Komma verschiebt
Rundungsfehlerein kleiner Unterschied, weil ein Wert nicht genau passt

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Bevor du anfängst

Notiz

Drück oben in der Leiste auf Lab starten und warte, bis die Maschine läuft. Jede Schaltfläche Ausführen tippt ihren Befehl in das Terminal, einen nach dem anderen.

Das oberste Bit zählt negativ

Im Zweierkomplement ist das Bit ganz links nicht 128 wert, sondern -128. Die anderen sieben Bits behalten ihren Wert.

Ein Byte mit einer 0 vorne ist also null oder positiv. Ein Byte mit einer 1 vorne ist negativ. So hält ein Byte die Zahlen von -128 bis 127. Das sind wieder 256 verschiedene Zahlen.

Beispiel: ein Byte, zwei Lesarten

BitsGelesen als 0 bis 255Gelesen im ZweierkomplementSo kommt es zustande
00000101554 + 1
0111111112712764 + 32 + 16 + 8 + 4 + 2 + 1
10000000128-128-128
11111101253-3-128 + 64 + 32 + 16 + 8 + 4 + 1
11111111255-1-128 + 127

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Alle Bits umdrehen, dann eins dazu

Eine negative Zahl schreibst du in drei Schritten. Schreib die positive Zahl mit acht Bits. Dreh jedes Bit um, aus 0 wird 1 und aus 1 wird 0. Zähl dann eins dazu.

Dieselben Schritte machen aus einer negativen Zahl wieder die positive.

Beispiel: so entsteht -3

SchrittBits
3 schreiben00000011
Jedes Bit umdrehen11111100
Eins dazuzählen11111101

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

In den Ordner arch wechseln

Befehl
cd ~/arch

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Programm endet mit -3

Befehl
python3 -c "raise SystemExit(-3)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Frag die Shell nach dem Status

Befehl
echo $?

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Bits von -3 zeigen

Befehl
python3 -c "print(format(-3 & 255, '08b'))"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele glauben, die Bits selbst sagen, ob eine Zahl negativ ist. Das tun sie nicht. Das Programm gab -3 als die Bits 11111101 zurück. Die Shell liest diese Bits als 0 bis 255 und zeigt darum 253. Wer die Bits liest, entscheidet, was sie bedeuten.

Festkomma lässt das Komma stehen

Bei Geld sind Kommazahlen gefährlich. Viele Kassen speichern darum Cent: 12,50 € werden zu 1250. Jede Rechnung bleibt dann bei ganzen Zahlen, und die sind genau.

Binär geht das genauso. Leg fest, wo das Komma steht. Die Stellen danach sind ein Halb, ein Viertel, ein Achtel und so weiter wert.

Beispiel: 5,25 im Festkomma

Stellenwert8421,1/21/41/81/16
Bit0101,0100
Wert0401,01/400

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Gleitkomma verschiebt das Komma

Festkomma kann eine sehr große und eine sehr kleine Zahl nicht mit denselben Bits halten. Gleitkomma speichert die Ziffern und eine Potenz getrennt, so wie 5,25 als 0,525 × 10.

Die meisten Kommazahlen, etwa 0,1, haben binär keine genaue Form. Sie werden sehr nah, aber nicht genau gespeichert.

Python rechnet 0.1 plus 0.7

Befehl
python3 -c "print(0.1 + 0.7)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ist das genau 0.8?

Befehl
python3 -c "print(0.1 + 0.7 == 0.8)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Dieselbe Rechnung in Cent

Befehl
python3 -c "print(10 + 70)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Weiterführend: der Zähler mit 32 Bits

Der Zähler aus dem Einstieg hatte 32 Bits im Zweierkomplement. Das oberste Bit war also -2.147.483.648 wert.

Welche Zahl hätte der Zähler gezeigt, wenn bei 2.147.483.647 noch ein Aufruf dazugekommen wäre? Prüf deine Antwort danach im Terminal mit python3 -c "print(2**31)".

Über dieses Lab und seinen Quellcode: Lab für Compilerbau und Rechnerarchitektur: gcc, flex, bison und RISC-V in einer VM

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.