Wikipedia · einfach zusammengefasst · Stand
Byte-Reihenfolge
Die Byte-Reihenfolge (englisch byte order oder endianness) bezeichnet in der Informatik die Speicherorganisation für einfache Zahlenwerte, in erster Linie …
Inhalt5 Abschnitte
Grundprinzip und Definition
Die Byte-Reihenfolge (englisch byte order oder endianness) beschreibt, wie mehrteilige Zahlenwerte im Speicher abgelegt werden. Besonders wichtig ist sie bei Ganzzahlen, aber auch bei Gleitkommazahlen und anderen Datentypen, die der Prozessor intern ähnlich behandelt, etwa UTF-16.
Ein Speicher besteht aus adressierbaren Einheiten; in diesem Artikel ist die kleinste Einheit ein Byte mit 8 Bits. Ein Datenfeld liegt zusammenhängend in aufeinanderfolgenden Speicheradressen. Seine Anfangsadresse dient als Zeiger auf das Feld. Der Abstand eines Bytes von dieser Anfangsadresse heißt Offset.
Bei einem Stellenwertsystem besitzt jede Ziffer neben ihrem Einzelwert eine Wertigkeit oder Signifikanz, die von ihrer Position abhängt. Für eine Zahl gilt:
- Little-Endian: Steigt die Wertigkeit mit wachsender Speicheradresse, liegt das niedrigstwertige Byte zuerst.
- Big-Endian: Fällt die Wertigkeit mit wachsender Speicheradresse, liegt das höchstwertige Byte zuerst.
Beim Big-Endian-Format wird also das höchstwertige Byte an der kleinsten Adresse gespeichert. Beim Little-Endian-Format steht dort das niedrigstwertige Byte. Umgangssprachlich heißen diese Varianten auch „Motorola-Format“ beziehungsweise „Intel-Format“.
Die Byte-Reihenfolge ist von der Bit-Reihenfolge zu unterscheiden. Bei serieller bitweiser Übertragung wird zusätzlich festgelegt, ob das höchstwertige Bit zuerst übertragen wird (Most-Significant-Bit-First, MSb, etwa bei I²C) oder das niedrigstwertige Bit (Least-Significant-Bit-First, LSb, etwa bei RS-232 und Ethernet-Frames).
32-Bit-Beispiel und Mischformen
Die 32-Bit-Ganzzahl 168.496.141 hat den hexadezimalen Wert 0A0B0C0Dₕ und wird ab der angenommenen Speicheradresse 10000 in vier Bytes gespeichert:
- Big-Endian: an den Adressen 10000 bis 10003 liegen 0Aₕ, 0Bₕ, 0Cₕ, 0Dₕ.
- Little-Endian: an denselben Adressen liegen 0Dₕ, 0Cₕ, 0Bₕ, 0Aₕ.
Einige ältere Systeme, zum Beispiel der PDP-11, verwenden eine Mischform: 0Bₕ, 0Aₕ, 0Dₕ, 0Cₕ. Diese wird mixed-endian oder middle-endian genannt; sie entspricht ausdrücklich nicht der Reihenfolge 0Cₕ, 0Dₕ, 0Aₕ, 0Bₕ. Systeme, die beide Varianten unterstützen, heißen bi-endian.
Die übliche Schreibweise von Zahlen ist aus Sicht der europäischen Leserichtung big-endian. Im Deutschen werden Zahlen von 13 bis 99 jedoch little-endian ausgesprochen, etwa „Ein-und-Zwanzig“, weil die weniger wertige Stelle zuerst genannt wird. Die Dezimalzahl 1230 hat in einer umgekehrten little-endian-Darstellung die Form 0321.
Hexdump, Text und Unicode
Ein Dump stellt Speicherinhalte zur Fehleranalyse eindeutig dar. Bei 8-Bit-Bytes gibt das Hexadezimalsystem jeden möglichen Byteinhalt mit zwei Hexadezimalziffern an: 2⁸ = 256 = 16². Häufig wird daneben eine lesbare Zeicheninterpretation angezeigt, damit gespeicherter Text erkennbar wird.
Für die zwei Bytes a7ₕ und 32ₕ gilt unabhängig von der Byte-Reihenfolge:
- Als zwei vorzeichenlose 8-Bit-Zahlen ergeben sie 167 und 50.
- Als 16-Bit-Zahl ergibt Big-Endian die Bytefolge a732ₕ = 42.802₁₀.
- Als 16-Bit-Zahl ergibt Little-Endian die Bytefolge 32a7ₕ = 12.967₁₀.
Bei einem einzelnen Byte oder einer Ansammlung einzelner Bytes, etwa Text nach ISO 8859, macht Endianness keinen Unterschied. Sie wird erst relevant, wenn mehrere Bytes gemeinsam einen Zahlenwert bilden. Bei Little-Endian werden die Bytes solcher Integer-Felder gegenüber Big-Endian in der Regel gespiegelt.
Auch bei Unicode kann eine Bytereihenfolge-Markierung (BOM) verwendet werden. Die UTF-16-Kodierung des Wortes „Die“ benötigt für drei Zeichen 6 Byte; die BOM benötigt 2 Byte. Big-Endian erscheint als „FE FF 00 44 00 69 00 65“, Little-Endian als „FF FE 44 00 69 00 65 00“.
Auswirkungen auf Rechenoperationen und Hardware
Die Wahl der Byte-Reihenfolge hängt unter anderem damit zusammen, an welcher Stelle Rechenalgorithmen beginnen. Addition, Subtraktion und Multiplikation beginnen bei der niedrigstwertigen Stelle. Division und Vergleiche beginnen dagegen bei der höchstwertigen Stelle.
Big-Endian:
- Addition, Subtraktion und Multiplikation benötigen eine geringfügige zusätzliche Positionierung, weil die kleinste Adresse zunächst auf das höchstwertige Byte zeigt.
- Division und Vergleiche sind marginal einfacher.
- Vorzeichenlose Big-Endian-Zahlen können wie kurze Texte lexikographisch verglichen werden. Für lange Zeichenketten gibt es beispielsweise bei IBM/370 den Befehl CLCL.
- Hexdumps sind leichter lesbar, weil die Byte-Reihenfolge der üblichen Zahlenschreibweise entspricht.
Little-Endian:
- Addition, Subtraktion und Multiplikation sind geringfügig einfacher in Hardware zu implementieren, weil die niedrigstwertige Stelle an der kleinsten Adresse liegt.
- Eine Zwei-Byte-Zahl kann durch das Anhängen zweier mit Null gefüllter Bytes in eine Vier-Byte-Zahl überführt werden, ohne die Speicheradresse zu ändern. Bei Big-Endian müsste der Wert vorher verschoben werden.
- Division und lexikographische Vergleiche sind marginal aufwändiger; bei manchen Maschinen wird dafür ein Unterprogramm wie memcmp() benötigt.
Frühe Mikroprozessoren arbeiteten zunächst mit 4, später lange mit 8 Bit, obwohl ihre Adressbusse breiter waren. Deshalb mussten größere Werte auf mehrere Register verteilt werden. Das automatische Laden des niederwertigen Datenanteils konnte die CPU vereinfachen. Bei Großrechnern mit Datenbusbreiten von 16 bis 48 Bit spielte die Byte-Reihenfolge zunächst eine geringere Rolle.
Datenaustausch, Plattformen und Dateiformate
Für den Datenaustausch zwischen unterschiedlichen Computern wird in Netzwerkprotokollen eine feste Byte-Reihenfolge verwendet. Sie heißt Network Byte Order. Die natürliche Reihenfolge des Systems heißt Host Byte Order. Im heute vornehmlich verbreiteten Internetprotokoll-Satz ist Network Byte Order Big-Endian; andere Protokolle können abweichen.
Die BSD-IP-Socket-API stellt für Umwandlungen Funktionen bereit: htond() und ntohd() für double (64 Bit), htonl() und ntohl() für long (32 Bit) sowie htons() und ntohs() für short (16 Bit). Die Umwandlung ist für vorzeichenlose Ganzzahlen garantiert. Negative Ganzzahlen werden korrekt behandelt, wenn sie im Zweierkomplement und mit gleicher Bitbreite dargestellt sind. Auf Big-Endian-Maschinen sind die Funktionen trivial, weil Host- und Network Byte Order übereinstimmen. Ihre Verwendung erleichtert die Übertragbarkeit von Netzwerkprogrammen.
Byte-Order-Probleme können auch bei Dateien und Datenträgern auftreten. Dateiformate müssen die Reihenfolge eindeutig definieren oder beim Laden erkennen und umwandeln. Beim Interchange File Format (IFF) werden Vier-Byte-Chunk-Längen im Motorola-Format Big-Endian gespeichert. Das davon abgeleitete Resource Interchange File Format (RIFF) verwendet für Windows das Intel-Format Little-Endian; es bildet unter anderem die Grundlage für RIFF WAVE (.wav) und Audio Video Interleave (.avi). TIFF erlaubt beide Varianten: II kennzeichnet Intel-Format (Little-Endian), MM Motorola-Format (Big-Endian). Nachfolgende Längen- und Offset-Werte werden entsprechend kodiert.
Das NUXI-Problem veranschaulicht die Wirkung auf Textdaten: Wird „UNIX“ in zwei Zwei-Byte-Words gespeichert, erscheint es Big-Endian als „UNIX“, Little-Endian wegen der Bytevertauschung innerhalb der Wörter als „NUXI“. Auf 32-Bit-Systemen kann in einem einzelnen 32-Bit-Register „XINU“ entstehen.
Big-Endian wird unter anderem bei IBM-Mainframes, MIPS, SPARC, Power, PowerPC und Motorola-6800/68k verwendet; Little-Endian bei x86-kompatiblen PCs, RISC-V und standardmäßig ARM, das etwa in RP2040-Mikrocontrollern, Raspberry-Pi-Systemen und den meisten Mobiltelefonen eingesetzt wird. Bestimmte MIPS-, POWER/PowerPC-, Alpha-, ARM- und IA-64-Systeme können zwischen den Varianten umschalten oder beide unterstützen.