Speicher und Bytes: Byte-Reihenfolge, Datentypen und Adressen

Im Speicher liegt an jeder Adresse ein Byte. Zahlen, die mehr Platz brauchen, verteilen sich auf mehrere Adressen. Der Lesebefehl legt fest, welche Bytes zusammengehören, in welcher Reihenfolge sie stehen und als welcher Zahlentyp sie gelesen werden. Wähle unten aus, wie du lesen möchtest. Die verwendeten Bytes leuchten auf; darunter steht jeweils der Stellenwert, mit dem das Byte multipliziert wird.

Interaktive Simulation wird geladen...

Lektion

Die Theorie — Speicher und Bytes: Byte-Reihenfolge, Datentypen und Adressen

Ein Byte besteht aus acht Bits und kann einen Wert von 0 bis 255 annehmen. An jeder Speicheradresse liegt ein Byte. Eine Zahl, die mehr Platz braucht, belegt aufeinanderfolgende Adressen; bei einer 32-Bit-Ganzzahl sind es vier. Die Byte-Reihenfolge legt fest, wie diese Bytes angeordnet sind. Bei Little-Endian liegt das niederwertigste Byte an der niedrigsten Adresse, bei Big-Endian das höchstwertige. Als Ganzzahl ohne Vorzeichen gelesen ergeben vier Bytes b₀·256⁰ + b₁·256¹ + b₂·256² + b₃·256³, wobei bₖ das Byte an der Stelle k bezeichnet. Beim Lesen mit Vorzeichen wird 2³² abgezogen, wenn diese Summe mindestens 2³¹ beträgt. Beim Lesen als Gleitkommazahl werden dieselben Bits nach IEEE 754 ausgewertet.

Was die einzelnen Symbole bedeuten

bₖ
das Byte an der Stelle k, von 0 (niederwertigste Stelle) bis 3
256ᵏ
sein Stellenwert: 1, 256, 65.536 oder 16.777.216
Setzt voraus
Ganzzahlen mit Vorzeichen werden im Zweierkomplement dargestellt, Gleitkommazahlen nach IEEE 754 mit einfacher Genauigkeit, wie auf allen heutigen Desktop- und Smartphone-Prozessoren. Für Text gilt hier ASCII mit einem Byte pro Zeichen. UTF-8, das heute in den meisten Dateien verwendet wird, benötigt bis zu vier Bytes für ein Zeichen.

Bei falscher Byte-Reihenfolge wird aus 1 die Zahl 16.777.216 🖖

Klick auf 1 rückwärts gelesen. Ein x86-Prozessor speichert 1 als 32-Bit-Ganzzahl so, dass 01 an der niedrigsten Adresse liegt und danach drei Nullbytes folgen. ARM-Prozessoren in Smartphones verwenden dieselbe Reihenfolge: Little-Endian, mit dem niederwertigsten Byte zuerst. Beim Lesen in Big-Endian gilt das erste Byte als höchstwertiges. Dieselbe 01 hat dann den Wert 256³, und die Zahl lautet 16.777.216. Die Bytes bleiben dabei unverändert. Von den 4.294.967.296 möglichen 32-Bit-Werten ergeben nur jene 65.536 in beiden Reihenfolgen denselben Wert, bei denen das erste Byte dem vierten und das zweite dem dritten gleicht. Dazu gehört auch −1 mit den Bytes FF FF FF FF. Danny Cohen benannte die beiden Reihenfolgen 1980 nach dem Krieg in Gullivers Reisen, bei dem es darum geht, an welchem Ende ein gekochtes Ei aufzuschlagen ist.

π und 1.078.530.011 bestehen aus denselben vier Bytes 🖖

Klick auf π als Ganzzahl. Als 32-Bit-Gleitkommazahl gespeichert besteht π aus den vier Bytes DB 0F 49 40. Dabei wird π auf die nächstgelegene darstellbare Gleitkommazahl gerundet: 3,14159274. Lies die Bytes als Ganzzahl mit Vorzeichen, und du erhältst 1.078.530.011. Mit umgekehrter Byte-Reihenfolge ergibt sich −619.755.200. Als Text gelesen enthalten sie zwei Zeichen, I und @, sowie zwei nicht druckbare Bytes. Die Bytes selbst enthalten keine Kennzeichnung als „Gleitkommazahl“. Schon beim Little Man Computer ließ sich im Speicher ein Befehl nicht von einer Zahl unterscheiden. Ebenso wenig kann ein Byte-Speicher verschiedene Zahlentypen auseinanderhalten. Den Datentyp bestimmt der Lesebefehl. Deshalb kann ein Programm mit dem falschen Datentyp einen falschen Wert lesen, ohne eine Fehlermeldung zu erhalten.

Eine Adresse daneben: Zwei positive Zahlen ergeben eine negative 🖖

Klick auf Eine Adresse daneben. 1.000 liegt an Adresse 0 und 2.000 an Adresse 4, beide in Little-Endian: E8 03 00 00 D0 07 00 00. Beginnt das Lesen von 32 Bit an Adresse 1 statt an Adresse 0, kommen 03 00 00 aus der ersten Zahl und D0 aus der zweiten. D0 steht damit an der höchstwertigen Stelle: 3 + 208 × 256³ = 3.489.660.931. Als Ganzzahl mit Vorzeichen gelesen ist das −805.306.365, weil das höchste Bit von D0 gesetzt ist. Keine der beiden gespeicherten Zahlen lässt sich im Ergebnis wiedererkennen. Im Speicher gab es auch keine Markierung dafür, wo die erste Zahl endete.

Aufgabe vollständig gelöst

  1. Wie groß ist dieses Bild? 4 Schritte

    Klick auf PNG-Dateikopf. Du siehst die ersten 24 Bytes einer PNG-Datei. Laut PNG-Spezifikation werden alle Ganzzahlen, die mehr als ein Byte belegen, in Big-Endian gespeichert. Der IHDR-Datenblock beginnt mit der Breite, gefolgt von der Höhe, mit jeweils vier Bytes. Bestimme Breite und Höhe. Berechne auch, welche Maße ein Programm erhalten würde, das die Bytes in Little-Endian liest.

    Öffne diese Aufgabe im Tool

    1. Die Datei beginnt mit einer Signatur aus acht Bytes: 89 50 4E 47 0D 0A 1A 0A. Die nächsten vier Bytes geben die Länge des ersten Datenblocks in Big-Endian an: 00 00 00 0D entspricht 13. Danach folgt sein Typ, 49 48 44 52, als Text gelesen IHDR. Die Daten dieses Blocks beginnen also an Adresse 16.

    2. Die Breite steht an den Adressen 16 bis 19: 00 00 01 E0. In Big-Endian liegt 01 an der Stelle 256¹ und E0, also 224, an der Stelle 256⁰: 256 + 224 = 480. Wenn du im Werkzeug ab Adresse 16 liest, erhältst du denselben Wert.

    3. Die Höhe steht an den Adressen 20 bis 23: 00 00 01 0E. Das ergibt 256 + 14 = 270.

    4. In Little-Endian wird das letzte Byte zum höchstwertigen. Die Breite wäre dann 224 × 256³ + 1 × 256² = 3.758.161.920 und die Höhe 14 × 256³ + 256² = 234.946.560.

    Antwort

    480 × 270 Pixel. In Little-Endian gelesen ergeben dieselben Bytes 3.758.161.920 × 234.946.560, also etwa 8,83 × 10¹⁷ Pixel. Bei vier Bytes pro Pixel wären das 3,53 × 10¹⁸ Bytes. Damit das Programm die Werte richtig liest, muss es die in der Spezifikation festgelegte Byte-Reihenfolge kennen; die Datei enthält dazu keinen eigenen Hinweis.

Lernpfad

Wie ein Computer ein Programm ausführt

Quellen (2)