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
| Begriff | Was er bedeutet |
|---|---|
| Zweierkomplement | die übliche Art, negative ganze Zahlen in Bits zu speichern |
| Höchstwertiges Bit | das Bit ganz links, das am meisten wert ist |
| Überlauf | ein Ergebnis, das nicht mehr in seine Bits passt |
| Festkomma | eine Zahl, deren Komma immer an derselben Stelle steht |
| Gleitkomma | eine Zahl aus Ziffern und einer Potenz, die das Komma verschiebt |
| Rundungsfehler | ein 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
| Bits | Gelesen als 0 bis 255 | Gelesen im Zweierkomplement | So kommt es zustande |
|---|---|---|---|
| 00000101 | 5 | 5 | 4 + 1 |
| 01111111 | 127 | 127 | 64 + 32 + 16 + 8 + 4 + 2 + 1 |
| 10000000 | 128 | -128 | -128 |
| 11111101 | 253 | -3 | -128 + 64 + 32 + 16 + 8 + 4 + 1 |
| 11111111 | 255 | -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
| Schritt | Bits |
|---|---|
| 3 schreiben | 00000011 |
| Jedes Bit umdrehen | 11111100 |
| Eins dazuzählen | 11111101 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
In den Ordner arch wechseln
cd ~/archHier 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
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
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
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
| Stellenwert | 8 | 4 | 2 | 1 | , | 1/2 | 1/4 | 1/8 | 1/16 |
|---|---|---|---|---|---|---|---|---|---|
| Bit | 0 | 1 | 0 | 1 | , | 0 | 1 | 0 | 0 |
| Wert | 0 | 4 | 0 | 1 | , | 0 | 1/4 | 0 | 0 |
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
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?
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
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)".