Die Byte-Reihenfolge ( oder ) bezeichnet in der Informatik die Speicherorganisation für einfache Zahlenwerte, in erster Linie die Ablage ganzzahliger Werte (Integer) im Arbeitsspeicher.
Die ersten Rechnerarchitekturen haben die Darstellung mehrstelliger Zahlen aus dem Alltag entsprechend der Konvention des Stellenwertsystems übernommen, zunächst für dezimal, dann auch für binär dargestellte Zahlen. In dieser Konvention beginnt die Notation einer Zahl mit der Ziffer an der höchstwertigen Stelle. Addition, Subtraktion und Multiplikation beginnen aber mit der niedrigstwertigen Ziffer, der Einerstelle.
Solange man innerhalb ähnlicher Rechnerarchitekturen blieb, musste man sich nicht um die Endianness kümmern, sie entsprach ja der gewohnten. Da die genannten drei mathematischen Grundfunktionen jedoch einen Maschinenzyklus früher starten können, wenn man die Bitreihenfolge umkehrt, haben in der Folge einige Hersteller ein entsprechendes Architekturprinzip erstellt. Das heißt: die Einerstelle wird an die Anfangsadresse gelegt, und die 3 genannten Algorithmen schreiten nach rechts in die höheren Stellen und Adressen fort. Diese Abweichung vom Gewohnten machte die Begriffsbildung Endianness erforderlich: Beim big-endian (wörtlich etwa: „großendigen“, siehe auch Abschnitt „Etymologie“) Format wird das höchstwertige Byte zuerst gespeichert, d. h. an der kleinsten Speicheradresse. Allgemein bedeutet der Begriff, dass bei zusammengesetzten Daten die höchstwertige (höchstrangige) Komponente zuerst genannt wird, wie etwa bei der deutschen Schreibweise der Uhrzeit: Stunde:Minute:Sekunde. Beim little-endian (wörtlich etwa: „kleinendigen“) Format wird dagegen das niedrigstwertige Byte an der Anfangsadresse gespeichert, also die niedrigstwertige Komponente zuerst genannt, wie bei der herkömmlichen deutschen Datumsschreibweise: Tag.Monat.Jahr.
Im Sprachgebrauch werden die beiden Varianten in der Computertechnik oft auch nach den Herstellern von Mikroprozessoren benannt, die die jeweilige Variante in mehreren Prozessorfamilien verwenden bzw. verwendet haben: „Motorola-Format“ steht für big-endian, „Intel-Format“ für little-endian.
Werden Daten bitweise seriell übertragen, so ist zusätzlich die Bit-Reihenfolge festzulegen. Auch hier sind unterschiedliche Varianten anzutreffen: Most-Significant-Bit-First (MSb), wenn das höchstwertige Bit eines Bytes zuerst übertragen wird, verwendet etwa I²C. Least-Significant-Bit-First (LSb), in der das niedrigstwertige Bit eines Bytes zuerst übertragen wird, ist zum Beispiel für RS-232MIL-STD-188-100, S. B-8, Abb. 3, 1972. oder :Datei:MIL-STD-188-100 char struct for async comms 1972-11-15.svg und Ethernet-Frames festgelegt.
Vereinbarungen Folgende Aussagen, über die in der Literatur hochgradiger Konsens besteht, seien als Ausgangsbasis für die Diskussion und Definition der Sachverhalte explizit gemacht: Der Arbeitsspeicher kennt eine kleinste adressierbare Einheit, auch „Speicherstelle“ genannt. In diesem Artikel sei sie exemplarisch das Byte. Es besteht aus 8 Bits und sein Inhalt wird in diesem Artikel vorwiegend mit zwei hexadezimalen Ziffern angegeben, wobei jede Ziffer für 4 Bits entsprechend einem Halbbyte (Nibble) steht. Die kleinste adressierbare Einheit könnte aber auch aus einer anderen Anzahl von Bits bestehen, oder, wenn die Maschine im Dezimalsystem rechnet, eine Dezimalziffer beherbergen. Die (Byte-)Adressen des Arbeitsspeichers sind nicht-negative ganze Zahlen. Ein (einfaches) Datenfeld wird im Arbeitsspeicher in einem zusammenhängenden Speicherbereich (einer lückenlosen Folge von Adressen) abgelegt, der eine Anfangs-(Byte-)adresse und eine (Byte-)Länge hat. Die Maschinenbefehle adressieren ein Datenfeld über seine Anfangsadresse.Dies gilt vor allem für Maschinen, bei denen die Länge der Operanden im Maschinenbefehl codiert ist. Nicht in dieses Schema passen Maschinen wie die IBM 1401, bei der sogenannte „Wortmarken“ im Speicher die Ausdehnung der Speicheroperanden bestimmen. Solche Maschinen können – je nach Maschinenbefehl – ein aus (mehreren zusammenhängenden Speicherstellen bestehendes) Feld an seiner niedrigen oder seiner hohen Adresse ansprechen und zum anderen Ende hin abarbeiten; so adressiert beispielsweise der Addieren-Befehl der IBM 1401 die Operanden an der Einerstelle (bei dieser Maschine an der hohen Adresse) und arbeitet sich zur Wortmarke vor. Beim Dividieren-Befehl wird der Dividend an der höchstwertigen Stelle (der niedrigen Adresse) und der Divisor an der Einerstelle angesprochen. IBM 1410 Principles of Operation. (PDF; 22 MB) informatik.uni-stuttgart.de, S. 9; abgerufen am 3. November 2014. Ganz analog spielt in Assemblersprachen und in höheren Programmiersprachen die Anfangsadresse die Rolle eines Zeigers zum Datenfeld. Das Byte an der Anfangsadresse wird häufig als das linke, das an der Endadresse als das rechte Byte bezeichnet (siehe Bit-Reihenfolge). An diese Orientierung halten sich horizontale graphische Darstellungen von Datenfeldern sehr häufig, aber nicht immer. Ein Byte innerhalb eines einfachen Datenfelds hat zu dessen Anfangsadresse einen (nicht-negativen) Abstand, der als Offset bezeichnet wird. Betrachtet werden numerische Daten, die im Speicher entsprechend einem Stellenwertsystem dargestellt sind. Bei einem solchen System kommt einer Ziffer neben ihrem Wert als einzelnem Zeichen noch ein (von ihrer Position innerhalb der ganzen Zahl abhängiger) Stellenwert zu, auch „Wertigkeit“ oder „Signifikanz“ genannt. Die in Handbüchern und unten vorkommenden hexadezimalen Notationen 3A4B5C6Dh oder 0x3A4B5C6D bezeichnen einen Zahlwert, und zwar die Zahl 978.017.389, und nicht ihre Darstellung im Speicher, es sei denn, man meint die Speicherung 3Ah4Bh5Ch6Dh. Will man eine andere Art der Speicherung derselben Zahl 0x3A4B5C6D angeben, so muss man auf andere Notationen ausweichen, wie auf 6Dh5Ch4Bh3Ah oder 0x6D,0x5C,0x4B,0x3A. Generell multipliziert ein Links-Shift eine Binärzahl mit einer Zweierpotenz, verschiebt also die Bits in Richtung „Big-End“ (= Richtung most significant bit), und ein Rechts-Shift dividiert durch eine solche, verschiebt die Bits in Richtung „Little-End“ (= Richtung least significant bit). Die Shift-Operationen induzieren eine eindeutige konsistente »Adressierung« von den Bytes auf die Bits (s. dazu den Abschnitt Adressierung von Bits).Dieser Zusammenhang zwischen Byte- und Bit-Reihenfolge wurde schon von Cohen (p. 3) hergestellt. (Die links-rechts-Orientierung bei Shift-Instruktionen ist etwas Anderes und völlig unabhängig von derjenigen bei der Adressierung mit links = niedrige und rechts = hohe Adresse.)
Steigt bei einer im Speicher abgelegten Zahl die Wertigkeit einer Stelle mit der wachsenden Adresse, dann ist sie im Little-Endian-Format dargestellt.
Fällt bei einer im Speicher abgelegten Zahl die Wertigkeit einer Stelle mit der wachsenden Adresse, dann ist sie im Big-Endian-Format dargestellt.
Wird bei einem Computersystem eines dieser beiden Formate für die Speicherung numerischerDer Vergleich von Zeichenketten durch Maschineninstruktionen oder die C-Funktionen memcmp() und strcmp() startet auf jeder Maschine am Anfangsbuchstaben der Zeichenkette und wertet damit die Stellen niedriger Adresse als höherrangig, agiert also im Big-Endian-Stil. Man nennt diese Übertragung der Ordnung von den einzelnen Bytes auf mehrstellige Felder, wenn sie bei der ersten Stelle beginnt, die lexikographische Ordnung. () Die Erwähnung von Zeichenketten („Strings“) in der Literatur, z. B. Big and Little Endian C-style strings und Byte Ordering, im Kontext der Endianness beschränkt sich häufig auf die Übertragungsweise. Felder durchgehalten, so wird das erste als Little-Endian-, das zweite als Big-Endian-System bezeichnet.
Beispiel: Speicherung einer 32-Bit-Ganzzahl in 4 Bytes mini|400px
Byte-Adresse BigEndian MixedEndian LittleEndian 10000 0A 0B 0D 10001 0B 0A 0C 10002 0C 0D 0B 10003 0D 0C 0A
Das Beispiel in der Grafik stellt die Ganzzahl 168.496.141 als 32-Bit-Integer-Wert dar (hexadezimal: 0A0B0C0Dh), gespeichert in 4 Bytes ab einer angenommenen Speicheradresse von 10000: Big-endian speichert 168496141 = 0A0B0C0Dh in der Reihenfolge 0Ah0Bh0Ch0Dh. Little-endian speichert168496141 = 0A0B0C0Dh in der umgekehrten Reihenfolge der Bytes 0Dh0Ch0Bh0Ah. Einige ältere Systeme (z. B. PDP-11) speichern die Bytes auch in der Reihenfolge 0Bh0Ah0Dh0Ch (aber nicht als 0Ch0Dh0Ah0Bh). Dies wird als mixed-endian oder auch middle-endian bezeichnet.
Einige Systeme speichern sowohl big-endian als auch little-endian, was als bi-endian bezeichnet wird.
Reihenfolge der Ziffern innerhalb von Zahlen in der Sprache Auch die gewöhnliche Darstellung von (Dezimal-)Zahlen ist – im Sinne der Leserichtung der meisten europäischen Sprachen von links nach rechts – big-endian. Dies kommt dadurch zustande, dass die Ziffernreihenfolge der arabischen Zahlschrift bei den Schriften Mitteleuropas beibehalten wurde. Im Arabischen, das sich von rechts nach links liest, werden die Zahlen gleich geschrieben, d. h. für Zahlen unter 100 werden sie als „little-endian“ gelesen (für Zahlen ab 100 werden sie „big-endian“ gelesen). Auch im Deutschen werden die Zahlen von 13 bis 99 little-endian ausgesprochen: „Ein-und-Zwanzig“; die Eins als weniger wertige Stelle wird zuerst gesprochen (diese Reihenfolge gibt es auch in anderen Sprachen).
Ein Beispiel für Dezimalzahlen: In der gebräuchlichsten Darstellung (big-endian) wird die Dezimalzahl Eintausend-zweihundert-dreißig dargestellt als „1230“, wobei die „1“ die Wertigkeit 1000 hat, die „2“ die Wertigkeit 100 und die „3“ die Wertigkeit 10. In der „Little-Endian“-Darstellung ist es umgekehrt, so dass die Darstellung der Zahl „0321“ wäre.
Kontexte des Byte-Reihenfolge-Problems Das Problem der Byte-Reihenfolge betrifft solche Datentypen, die aus mehreren Byte zusammengesetzt sind und vom jeweiligen Prozessor direkt unterstützt werden, also hauptsächlich Ganzzahl- und Gleitkommatypen, sowie Datentypen, die vom Prozessor effektiv als solche interne Datentypen behandelt werden, z. B. UTF-16.
Um dieses Problem bei Unicode-Zeichen zu umgehen, wird oft eine Bytereihenfolge-Markierung (BOM) benutzt. Die Zeichenfolge "Die" (drei Zeichen, 6 Byte) mit BOM (ein Zeichen, 2 Byte) als UTF-16-Kodierung, in der Byte-Darstellung von Hex-Editoren (8 Byte) stellt sich für die beiden unterschiedliche Byte-Reihenfolgen etwa so dar:
Big Endian: FE FF 00 44 00 69 00 65 | þÿ␣D␣i␣e Little Endian: FF FE 44 00 69 00 65 00 | ÿþD␣i␣e␣
Plattformübergreifende Darstellung von Zahlen Um einen fehlerfreien Datenaustausch zwischen Computern verschiedener Plattformen zu ermöglichen, ist bei Netzwerkprotokollen immer die Byte-Reihenfolge festgeschrieben. Diese wird als „Network Byte Order“ bezeichnet. Die natürliche Byte-Reihenfolge des Systems wird demgegenüber als „Host Byte Order“ bezeichnet. Arbeitet das System nicht mit dieser Byte-Reihenfolge, so muss diese im Netzwerktreiber beziehungsweise zum Teil im Anwendungsprogramm entsprechend umgewandelt werden.
Im Falle des heute vornehmlich verbreiteten Internetprotokoll-Satzes entspricht die Network Byte Order dem Big-Endian-Format. Es existieren jedoch noch immer Protokolle, die eine andere Byte-Reihenfolge verwenden. Darüber hinaus gibt es Datentypen, die nicht oder nicht nur durch die Endianness charakterisiert sind, wie z. B. Gleitkommazahlen, bei deren Umwandlung auch Genauigkeitsverluste möglich sind.
In der auf den meisten Betriebssystemen angebotenen BSD-IP-Socket-API existieren zur Umwandlung der Byte-Reihenfolge sechs Funktionen:
Datentyp (Wortbreite) Umwandlung Host-to-network Network-to-host double (64 bit) htond() ntohd() long (32 bit) htonl() ntohl() short (16 bit) htons() ntohs()
Die korrekte Umwandlung ist garantiert für vorzeichenlose Ganzzahlen. Negative Ganzzahlen werden korrekt umgewandelt, wenn sie im Zweierkomplement dargestellt sind und die Bitbreite übereinstimmt.