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

Zahlen und Text als Bits speichern

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

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

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

BegriffWas er bedeutetBeispiel
Biteine Binärziffer: 0 oder 1
Byteacht Bits, die Einheit, in der Speicher gezählt wird
Binärzahleine Zahl, die nur mit den Ziffern 0 und 1 geschrieben ist101010
HexadezimalBasis 16, eine Ziffer für je vier Bits0xac
Zweierkomplementdie übliche Art, negative ganze Zahlen in Bits zu speichern
Zeichencodedie Zahl, die für ein Zeichen steht90 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

Stellenwert1286432168421
Bit10101100
Zählt12803208400

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

In den Architektur-Ordner 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.

Python rechnet dreimal um

Befehl
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

Befehl
printf '%d %x\n' 172 172

Hier 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

BitsOhne Vorzeichen gelesenIm Zweierkomplement gelesen
0000010044
01111111127127
10000000128-128
11111100252-4
11111111255-1

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

Ein RISC-V-Programm, das subtrahiert

Befehl
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.s

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

Assemblieren

Befehl
riscv64-linux-gnu-as differenz.s -o differenz.o

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

Linken

Befehl
riscv64-linux-gnu-ld differenz.o -o differenz

Hier 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

Befehl
qemu-riscv64 ./differenz

Hier 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

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.

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

Befehl
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

Befehl
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?

Befehl
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

Befehl
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.

Ü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.