Little/Big Endian
Eigentlich könnte alles so einfach sein, sollte man meinen. Nachdem
unsere Ahnen das revolutionäre arabische Zahlensystem übernommen
und verinnerlicht hatten, profitieren wir heute in puncto Zahlen weltweit von
einer einheitlichen Zahlendarstellungsmethodik - Big Endian.
Big Endian bezeichnet die Schreibweise von Daten, beginnend mit dem
größtwertigsten Teil zuerst. Zum Beispiel schreiben wir die
Uhrzeit als Stunden, Minuten, Sekunden. Im Gegensatz dazu ist das Tagesdatum
Little Endian, nämlich Tag, Monat, Jahr. Schon hier wird
offensichtlich, dass diese Uneinheitlichkeit zu Problemen führt,
nämlich dann, wenn z.B. mehrere Zeitangaben der Reihenfolge nach
sortiert werden sollen. Beim Tagesdatum muss man von rechts beginnen, bei der
Uhrzeit von links.
Jede Zahl, bestehend aus Dezimalziffern, schreiben wir im Big-Endian-Format
von der größten zur kleinsten. Aber warum? Zumindest im Umgang mit
positiven ganzen Zahlen, was bei weitem am häufigsten der Fall ist,
wäre gerade die umgekehrte Darstellung, vom Kleinsten zum
Größten, sinnvoller.
Man lese bitte (laut) die folgende Aussage, für deren Richtigkeit ich mich
nicht verbürge. Soll nur das Prinzip verdeutlichen:
Deutschland hat auf einer Fläche von 35702119 Hektar
80219695 Einwohner.
Na, was gemerkt? Um überhaupt die ersten Ziffern als "35 Millionen"
betiteln zu können, muss man zunächst zum Ende der Zahl, dann
rückwärts Dreiergruppen bilden, und erst dann weiß man, was
man sagen soll.
Würden wir hingegen mit der kleinsten Ziffer beginnen, dann könnten
wir auch die Zahlen viel einfacher untereinander schreiben oder addieren,
ohne am Anfang schon wissen zu müssen, wie groß denn die
größte Zahl werden wird.
Zum Beispiel
Schuster : 71 (siebzehn)
Meier : 1402 (einundvierzigundzweitausend)
Lehmann : 39 (dreiundneunzig)
Schmidt : 007 (siebenhundert)
-------------------------------------------------
Summe : 1582 (einundfünfzigachthundertzweitausend)
Sieht komisch aus? Ist aber nur Gewöhnungssache und wirklich einfacher.
Die Kinder lernen in der Schule, mit der rechten Hand von links nach rechts
zu schreiben. Warum? Damit das eben Geschriebene nicht sofort wieder mit dem
Ärmel verwischt wird. Beim Rechnen gilt diese Grundregel plötzlich
nicht mehr.
Es scheint so, als ob irgend jemand im frühen Mittelalter da was falsch
verbunden hätte. In Europa war das Römische Zahlensystem
gängiger Standard, bis eine kluge Idee aus Arabien aufgegriffen wurde. Es
hat Jahrhunderte gedauert, bis sich das dezimale Stellenwertsystem mit der
Null, ursprünglich aus Indien, durchgesetzt hat.
Was aber nie in Frage stand, war die Anordnungsreihenfolge der
Dezimalstellen. Denn sowohl die Römer wie auch die Araber schreiben die
Ziffern ihrer Zahlen mit der größtwertigsten links und der
geringstwertigsten rechts. Es gibt aber einen entscheidenden Unterschied -
Araber schreiben von rechts nach links!
In Europa hätte man beim Rechnen mit den modernen arabischen Ziffern
diese also in ihrer Anordnungsreihenfolge umdrehen müssen.
Vermutlich hat es den Versuch sogar gegeben, denn im Deutschen spricht man
heute wie im Arabischen bei Zahlen bis Hundert die Einerstelle zuerst.
Im Laufe der Zeit hat sich das dezimale Stellenwertsystem mit arabischen
Ziffern auf der ganzen Welt durchgesetzt, und niemand schien sich an der
Big-Endian-Reihenfolge der Ziffern zu stören. Bis in den siebziger Jahren
die Mikroprozessoren aufkamen und das Informationszeitalter eröffneten.
Die Firma Intel hat damals klug und weise folgende Festlegung getroffen:
"Niederwertige Daten stehen immer auf niederwertigen
Adressen und werden zeitlich zuerst abgearbeitet."
Ein klares Bekenntnis zu Little Endian. Leider hat man die Rechnung ohne den
Wirt gemacht. Denn Intels Mut ging nicht soweit, auch noch die Bit-Reihenfolge
im Byte umzudrehen; von Bit 0 links bis Bit 7 rechts. Das
wäre die konsequente Revolution. Aber niemand hätte mehr irgendeine
Zahl in gewohnter Weise lesen können. (Man könnte meinen, das Byte
wird eh parallel verarbeitet und die Reihenfolge der Bits sei
interpretierbar. Ist sie nicht. Denn auch bei Little-Endian-Maschinen
multipliziert ein Links-Schiebebefehl den Datenwert. Er müsste dann aber
dividieren.)
Kurz, die Vorstellungskraft der Leute beim Lesen von Programm-Listings oder
bei der Entwicklung jeglicher Algorithmen wäre schlicht
überfordert. Deshalb ging Intel den Kompromiss ein, Registerinhalte und
Speicheradressen in gewohnter Darstellung zu dokumentieren, also Big Endian.
Das hat aber die fatale Folge, dass immer Bit 7..0 neben Bit 15..8 steht,
also 0 an 15 grenzt und nicht 7 an 8.
Bis die Firma Motorola kam und eine Lösung für den ganzen Spuk
hatte - Big Endian. Die Fachleute waren begeistert, insbesondere die
Hardware-Entwickler, die immer die einzelnen Strippen verdrahten müssen.
Deshalb hat sich auch das Motorola-Konzept in der gesamten Prozess- und
Steuerungstechnik rasch durchgesetzt. Man arbeitet einfach vom Großen
zum Kleinen, so wie auf dem Papier. Höherwertige Daten kommen zeitlich
zuerst. Genial! Damit war das Chaos perfekt.
Das wäre ein typisches Hardware-Interface, wie es sein sollte:
Und so sieht die Praxis aus, zum Beispiel:
Die Software wird's schon richten.
Das ist zwar nicht genau unser Little/Big- Endian-Problem, ist aber mit
diesem verwandt. Bei Wortbreiten von 32 oder 64 bit gibt's entsprechend mehr
Vertauschungsmöglichkeiten.
Ein Kollege, der die Aufgabe hatte, auf einem externen Speicher eine
CRC-Summe zu prüfen, ist daran schier verzweifelt, weil diese zuerst
little endian abgelegt wurde, sich dann aber die Prozessorgeneration
geändert hat, die alten Baugruppen aber weiter im Umlauf waren und
irgendwann mal mit einer neuen Zentraleinheit Kontakt gehabt haben konnten.
Die Lösung war dann die: Man prüfe einmal - wenn falsch, dann die
Bytes vertauschen und nochmal prüfen.
Um die Wupptizität weiter zu erhöhen, gibt es heute Prozessoren
(z.B. MPC860), bei denen das höchstwertigste Bit (MSB) "Bit 0" und das
niederwertigste (LSB) "Bit 31" heißt. Da fällt mir nichts mehr
ein.
Wer ist nun schuld an all dem Übel?
Die Römer!
Ich wage zu behaupten: Wenn die damals nicht mit Big Endian angefangen
hätten, dann wäre der Dreher vielleicht bei der Übernahme der
arabischen Zahlen in unsere von links nach rechts schreibende Welt
geglückt. Immerhin hat man's ja versucht, ist aber genau so gescheitert
wie heute Intel. In einer durchgängigen Little-Endian-Welt wäre
manches einfacher. Aber die Römer haben's versaut.
(Anmerkung: Weder die Römer noch Intel oder Motorola haben Big- oder Little-
Endian erfunden. Sie sind hier nur als wichtige Player im o.g. Konflikt genannt.)
Noch ein Beispiel:
Für die nebenstehende Messreihe soll ein Diagramm gezeichnet werden,
z.B. ein Geschwindigkeitsprofil, ungefähr so:
|
|
Zeit t[s] |
Geschw. v [m/s] |
1 | 2 |
10 | 9 |
100 | 80 |
1000 | 115 |
|
Nun stelle man sich vor, jemand würde Folgendes abliefern:
Jeder würde denken: "Der tickt ja wohl nicht richtig - fängt von
hinten an."
Aber genau so schreiben wir unsere Zahlen, z.B. die Dezimalzahl 2403.
Stellt sich zum Schluss noch die Frage, was mit den anderen Zahlen ist, z.B.
Gleitkomma. Der Vorteil von Little Endian liegt doch darin, dass man immer genau
sagen kann, wo die Einerstelle ist, nämlich am Anfang. Bei Gleitkommazahlen
gibt es aber nur eine Ziffernfolge, die die Genauigkeit repräsentiert,
abhängig von der Registergröße; und als zusätzliche
Information die Größenordnung (Komma oder Exponent). Bei
Gleitkommazahlen ist Little oder Big Endian gleichwertig. (Obwohl, man
hätte natürlich auf die Erfindung des Kommas ganz verzichten
können und statt dessen nur die ohnehin notwendige Einheit mit der
richtigen Größenordnung versehen. Das machen wir ja heute
zusätzlich, allerdings nur in Dreierschritten, z.B. Kilo oder Milli. Ich
schlage vor: A = 101 .. Z = 1026 und a = 10-1
.. z = 10- 26, kombiniert mit Little Endian und die Einheit vor der
Zahl, wie bei der Währung, das wär's doch!) Auch Zahlen in
Komplementdarstellung (signed) dürften gleichwertig sein. Das Vorzeichen
würde sich immer an der höchstwertigsten Digit-Position am "Ende" der
Zahl befinden, egal ob links oder rechts. Vorausgesetzt, auch alle Bits sind
konsequent gedreht. Das ist leider bei Little-Endian-Maschinen nicht der Fall.
------
Die Bezeichnungen Big Endian und Little Endian gehen auf Jonathan Swifts
Roman "Gullivers
Reisen" zurück, in dem die Bewohner von Liliput in zwei verfeindeten
Gruppen leben. Die einen schlagen ihre Eier am dicken Ende auf, das sind die
Big Ender, während die Little Ender am spitzen Ende beginnen.
------
Kurze Karambolage von ARTE:
https://youtu.be/L5YZSZTO2tk
|