Das volle Parkhaus mit 252 freien Plätzen
Die Anzeige an einem Parkhaus zählt die freien Plätze. Das Parkhaus ist voll, die Anzeige steht auf 0. Dann meldet ein Sensor aus Versehen vier Autos zu viel.
Jetzt zeigt die Anzeige 252 freie Plätze. Kaputt ist nichts. Das Programm hat -4 gespeichert, so gut es in acht Bits ging. Die Anzeige hat diese Bits als gewöhnliche Zahl gelesen.
Am Ende dieser Lektion
Notiz
Ich kann Zahlen und Text als Bits speichern.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Bit | eine Binärziffer: 0 oder 1 | |
| Byte | acht Bits, die Einheit, in der Speicher gezählt wird | |
| Binärzahl | eine Zahl, die nur mit den Ziffern 0 und 1 geschrieben ist | 101010 |
| Hexadezimal | Basis 16, eine Ziffer für je vier Bits | 0xac |
| Zweierkomplement | die übliche Art, negative ganze Zahlen in Bits zu speichern | |
| Zeichencode | die Zahl, die für ein Zeichen steht | 90 für Z |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Jede Stelle ist doppelt so viel wert
Im Zehnersystem ist jede Stelle zehnmal so viel wert wie die Stelle rechts daneben. Bei einer Binärzahl ist jede Stelle doppelt so viel wert.
Acht Stellen bilden ein Byte. Sie sind 128, 64, 32, 16, 8, 4, 2 und 1 wert. Addieren Sie die Stellen, an denen eine 1 steht. So ist 10101100 gleich 128 + 32 + 8 + 4, also 172.
Beispiel: 172 in einem Byte
| Stellenwert | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|---|
| Bit | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 |
| Zählt | 128 | 0 | 32 | 0 | 8 | 4 | 0 | 0 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
In den Architektur-Ordner 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.
Python rechnet dreimal um
python3 -c "print(bin(42), hex(42), int('101010', 2))"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Auch die Shell schreibt Hexadezimal
printf '%d %x\n' 172 172Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Hex-Ziffer steht für vier Bits
Hexadezimal hat sechzehn Ziffern: 0 bis 9 und dann a bis f für zehn bis fünfzehn. Jede Hex-Ziffer steht für genau vier Bits.
Ein Byte sind also immer zwei Hex-Ziffern. 172 ist 1010 1100, also a und dann c, geschrieben 0xac. Werkzeuge für Speicher und Maschinencode zeigen Hex, weil es kurz ist und trotzdem zu den Bits passt.
Das oberste Bit zählt negativ
Ein Byte hat kein Minuszeichen. Beim Zweierkomplement zählt das oberste Bit -128 statt 128. Die anderen sieben Bits behalten ihren Wert.
So ist 11111111 gleich -128 + 127, also -1. Und 10000000 ist -128 allein. Eine negative Zahl schreiben Sie so: 256 dazuzählen und das Ergebnis als gewöhnliches Byte schreiben. Aus -4 wird 252, also 11111100.
Beispiel: ein Byte, zweimal gelesen
| Bits | Ohne Vorzeichen gelesen | Im Zweierkomplement gelesen |
|---|---|---|
| 00000100 | 4 | 4 |
| 01111111 | 127 | 127 |
| 10000000 | 128 | -128 |
| 11111100 | 252 | -4 |
| 11111111 | 255 | -1 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein RISC-V-Programm, das subtrahiert
printf '.globl _start\n_start:\n li a0, 5\n li a1, 9\n sub a0, a0, a1\n li a7, 93\n ecall\n' > differenz.sHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Assemblieren
riscv64-linux-gnu-as differenz.s -o differenz.oHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Linken
riscv64-linux-gnu-ld differenz.o -o differenzHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Im Emulator ausführen
qemu-riscv64 ./differenzHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Exit-Status lesen
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.
Ein häufiger Fehler
Warnung
Viele glauben, die Bits selbst sagen, ob eine Zahl negativ ist. Das tun sie nicht. Das Programm hat 5 - 9 gerechnet und -4 in a0 gelassen. Linux behält die unteren acht Bits, 11111100. Die Shell liest sie ohne Vorzeichen: 252. Was die Bits bedeuten, entscheidet der Leser.
Auch Text besteht aus Zahlen
Ein Computer speichert ein Zeichen als seinen Zeichencode. Z ist 90 und z ist 122. Die ersten 128 Codes sind in allen üblichen Verfahren gleich.
UTF-8 speichert diese 128 Zeichen in je einem Byte. Jedes andere Zeichen braucht zwei bis vier Bytes. Das ü hat den Code 252 und wird in UTF-8 als die zwei Bytes c3 bc gespeichert. „Müll“ hat also vier Buchstaben, aber fünf Bytes.
Zeichencodes und UTF-8-Bytes
python3 -c "print(chr(252).encode('utf-8'), ord('Z'), ord('z'))"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Brüche werden nur ungefähr gespeichert
Eine Kommazahl wie 0,1 wird als Gleitkommazahl gespeichert: ein Vorzeichen, eine Zweierpotenz und ein Bruchteil, zusammen 64 Bits. Die meisten Dezimalbrüche lassen sich in Zweierpotenzen nicht genau schreiben. Ein Drittel lässt sich ja auch dezimal nicht genau schreiben.
Deshalb ist 3 mal 0,1 sehr nahe an 0,3, aber nicht gleich. Prüfen Sie Geldbeträge nie mit == auf Gleitkommazahlen.
Dreimal 0,1 rechnen
python3 -c "print(0.1 * 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.
Ist 1,1 + 2,2 gleich 3,3?
python3 -c "print(1.1 + 2.2 == 3.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.
Die Bytes von 2026, kleinstes zuerst
python3 -c "print((2026).to_bytes(4, 'little').hex(' '))"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: eine Zahl verbreitern
Schreiben Sie -37 von Hand in 8 Bits. Schreiben Sie die Zahl dann in 16 Bits. Vergleichen Sie beide: Was steht in den acht neuen Bits links?
Prüfen Sie beides mit Ihrer Funktion zu_bits. Sagen Sie dann, was ein Prozessor tun muss, wenn er ein Byte mit Vorzeichen in ein 64-Bit-Register lädt.