Was ist der Vorteil des Little-Endian-Formats?

140

Intel-Prozessoren (und möglicherweise einige andere) verwenden das Little-Endian-Format für die Speicherung.

Ich frage mich immer, warum jemand die Bytes in umgekehrter Reihenfolge speichern möchte. Hat dieses Format irgendwelche Vorteile gegenüber dem Big-Endian-Format?

Cracker
quelle
1
Der 6502 war ein früher (der erste?) Pipeline-Prozessor. Ich erinnere mich an eine Behauptung, dass es sich aufgrund der Pipeline um ein Little-Endian-Problem handelt, aber ich habe jetzt keine Ahnung, was das gewesen sein könnte. Irgendwelche Vorschläge?
Steve314
1
@ Steve314: Meine Antwort erklärt, wie wenig Endian bei der Leistung in einer Pipeline-CPU hilft: programmers.stackexchange.com/q/95854/27874
Martin Vilcans
3
Little-Endian, Big-Endian - Sie müssen sich für das eine oder andere entscheiden. Als würde man links oder rechts fahren.
3
Ich empfehle Ihnen, Code in ASM zu schreiben, vorzugsweise für eine "Old-School" -Architektur wie 6502 oder Z80. Sie werden sofort sehen, warum diese Little Endian verwenden. Architekturen, die Big Endian verwenden, weisen bestimmte Merkmale in ihrem Befehlssatz auf, die dieses Format vorziehen. Es ist keine willkürliche Entscheidung!
Stefan Paul Noack
2
Jedes Bytereihenfolgesystem hat seine Vorteile. Mit Little-Endian-Maschinen können Sie das niedrigste Byte zuerst lesen, ohne die anderen zu lesen. Sie können sehr leicht überprüfen, ob eine Zahl ungerade oder gerade ist (das letzte Bit ist 0), was cool ist, wenn Sie sich für solche Dinge interessieren. Big-Endian-Systeme speichern Daten im Arbeitsspeicher so, wie wir Menschen es von links nach rechts sehen. Dies erleichtert das Debuggen auf niedriger Ebene.
Koray Tugay

Antworten:

198

So oder so gibt es Argumente, aber ein Punkt ist, dass in einem Little-Endian-System die Adresse eines bestimmten Wertes im Speicher, der als 32, 16 oder 8 Bit Breite angenommen wird, dieselbe ist.

Mit anderen Worten, wenn Sie einen Zwei-Byte-Wert im Speicher haben:

0x00f0   16
0x00f1    0

Wenn Sie diese '16' als 16-Bit-Wert (c 'short' auf den meisten 32-Bit-Systemen) oder als 8-Bit-Wert (im Allgemeinen c 'char') annehmen, wird nur der von Ihnen verwendete Abrufbefehl geändert, nicht die Adresse, die Sie abrufen von.

Auf einem Big-Endian-System mit den folgenden Angaben:

0x00f0    0
0x00f1   16

Sie müssten den Zeiger inkrementieren und dann den engeren Abrufvorgang für den neuen Wert ausführen.

Kurz gesagt: Auf Little-Endian-Systemen sind Casts ein No-Op.

Jimwise
quelle
3
Vorausgesetzt natürlich, dass die höherwertigen Bytes, die Sie nicht gelesen haben, vernünftigerweise ignoriert werden können (z. B. wissen Sie, dass sie sowieso Null sind).
Steve314
10
@ Steve314: Wenn ich in C 32 bis 16 Bits (z. B.) auf einem 2er-Komplement-System - der überwiegenden Mehrheit der Systeme - herunterwerfe, müssen die Bytes nicht Null sein, um ignoriert zu werden. Unabhängig von ihrem Wert kann ich sie ignorieren und die Erwartungen des C-Standards und des Programmierers erfüllen.
9
@ Stritzinger - es handelt sich um den von einem Compiler generierten Assembly- / Maschinencode, der nicht portierbar sein kann. Der zu kompilierende höhere Sprachcode ist portierbar - er kompiliert nur für verschiedene Operationen auf den verschiedenen Architekturen (wie bei allen Operationen).
Jimwise
7
Ich kaufe dieses Argument nicht, weil auf Big-Endian-Architekturen ein Zeiger eher auf das Ende als auf den Anfang eines Objekts verweisen könnte, auf das Sie sich beziehen und dann genau den gleichen Vorteil hätten.
Dan_waterworth
4
@dan_waterworth nicht ganz - beachten Sie beispielsweise die Zeigerarithmetikregeln in C und was passiert, wenn Sie Casts desselben Zeigers inkrementieren oder dekrementieren. Sie können die Komplexität verschieben, aber nicht beseitigen.
Jimwise
45

Ich frage mich immer, warum jemand die Bytes in umgekehrter Reihenfolge speichern möchte.

Big-Endian und Little-Endian sind aus menschlicher Sicht nur "normale Ordnung" und "umgekehrte Ordnung" und nur dann, wenn all dies wahr ist ...

  1. Sie lesen die Werte auf dem Bildschirm oder auf Papier.
  2. Sie setzen die niedrigeren Speicheradressen links und die höheren rechts.
  3. Sie schreiben in hexadezimaler Schreibweise mit dem Nybble höherer Ordnung links oder binär mit dem höchstwertigen Bit links.
  4. Sie lesen von links nach rechts.

Das sind alles menschliche Konventionen, die für eine CPU überhaupt keine Rolle spielen. Wenn Sie Nr. 1 und Nr. 2 beibehalten und Nr. 3 umblättern, erscheint Little-Endian Leuten, die Arabisch oder Hebräisch lesen und von rechts nach links geschrieben sind, als "vollkommen natürlich".

Und es gibt andere menschliche Konventionen, die Big-Endian unnatürlich erscheinen lassen, wie ...

  • Das "höhere" (höchstwertige) Byte sollte sich an der "höheren" Speicheradresse befinden.

Damals, als ich hauptsächlich 68K und PowerPC programmierte, hielt ich Big-Endian für "richtig" und Little-Endian für "falsch". Aber seit ich mehr mit ARM und Intel arbeite, habe ich mich an Little Endian gewöhnt. Es ist wirklich egal.

Bob Murphy
quelle
30
Zahlen werden in der Tat in arabischer und hebräischer Sprache von der [höchstwertigen Stelle] links bis zur [niedrigstwertigen Stelle] rechts geschrieben.
Random832
5
Warum werden dann Bits innerhalb eines Bytes im "Big Endian" -Format gespeichert? Warum nicht konsequent sein?
Tskuzzy
11
Sie sind nicht - Bit 0 ist gemäß Konvention das niedrigstwertige und Bit 7 das höchstwertige. Darüber hinaus können Sie Bits innerhalb eines Bytes im Allgemeinen nicht in eine Reihenfolge bringen, da Bits nicht einzeln adressierbar sind. Natürlich haben sie möglicherweise eine physische Reihenfolge in einem bestimmten Kommunikationsprotokoll oder Speichermedium, aber Sie müssen sich nicht mit dieser Reihenfolge befassen, es sei denn, Sie arbeiten auf niedriger Protokoll- oder Hardwareebene.
Stewart
3
BlueRaja: nur nach schriftlicher Vereinbarung auf Papier. Dies hat nichts mit der CPU-Architektur zu tun. Sie können das Byte als 0-7 LSB-MSB anstelle von 7-0 MSB-LSB schreiben, und aus algorithmischer Sicht ändert sich nichts.
SF.
2
@SF .: "Push short, Pop alles andere als kurz " wird dich trotzdem überraschen. Selbst wenn Sie nicht den Stapel korrumpiert durch Bytes schieben Sie nie oder umgekehrt Pop ... x86 (32-Bit), zum Beispiel, wirklich wirklich will der Stapel dword-ausgerichtet sein, und schieben oder etwas knallen , dass die Ursachen Wenn der Stapelzeiger nicht ein Vielfaches von 4 ist, können Ausrichtungsprobleme auftreten. Und selbst wenn dies nicht der Fall ist, wurde immer nur ein ganzes Wort / ein ganzes Wort / ein ganzes Wort / ein ganzes Wort / ein ganzes Wort / ein ganzes Wort / ein ganzes Wort / ein ganzes Wort / ein ganzes Wort / ein ganzes Wort / ein ganzes Wort / ein ganzes Wort usw. übertragen.
CHAO
41

OK, hier ist der Grund, wie ich ihn mir erklärt habe: Addition und Subtraktion

Wenn Sie Mehrbyte-Zahlen addieren oder subtrahieren, müssen Sie mit dem niedrigstwertigen Byte beginnen. Wenn Sie beispielsweise zwei 16-Bit-Zahlen hinzufügen, ist möglicherweise ein Übertrag vom niedrigstwertigen Byte zum höchstwertigen Byte vorhanden. Beginnen Sie also mit dem niedrigstwertigen Byte, um festzustellen, ob ein Übertrag vorliegt. Dies ist der gleiche Grund, warum Sie bei der Longhand-Addition mit der ganz rechten Ziffer beginnen. Sie können nicht von links beginnen.

Stellen Sie sich ein 8-Bit-System vor, das nacheinander Bytes aus dem Speicher abruft. Wenn das niedrigstwertige Byte zuerst abgerufen wird , kann die Addition gestartet werden, während das höchstwertige Byte aus dem Speicher abgerufen wird. Diese Parallelität ist der Grund, warum die Leistung in Little Endian auf einem solchen System besser ist. Wenn es warten müsste, bis beide Bytes aus dem Speicher abgerufen wurden, oder in umgekehrter Reihenfolge, würde es länger dauern.

Dies ist auf alten 8-Bit-Systemen der Fall. Auf einer modernen CPU bezweifle ich, dass die Bytereihenfolge einen Unterschied macht, und wir verwenden Little Endian nur aus historischen Gründen.

Martin Vilcans
quelle
3
Ah - also ist es ungefähr der gleiche Grund, warum ich Little-Endian-Chunk-Ordering für große ganze Zahlen verwende. Ich hätte das klären sollen. Die Leute müssen sich jetzt wirklich mit Kybernetik beschäftigen - mein Gehirn braucht schon dringend Ersatzteile und einige radikale Verbesserungen, ich kann es kaum erwarten, bis es soweit ist!
Steve314
2
Ein Gedanke - der 6502 hat nicht viel 16-Bit-Mathematik in der Hardware geleistet - es war immerhin ein 8-Bit-Prozessor. Es wurde jedoch eine relative Adressierung durchgeführt, wobei 8-Bit-Offsets mit Vorzeichen relativ zu einer 16-Bit-Basisadresse verwendet wurden.
Steve314
2
Beachten Sie, dass diese Idee immer noch für die ganzzahlige Arithmetik mit Mehrfachgenauigkeit von Bedeutung ist (wie von Steve314 gesagt), jedoch auf Wortebene. Jetzt sind die meisten Vorgänge nicht direkt von der Endianität des Prozessors betroffen: Auf einem Big-Endian-System kann immer noch das Wort mit der geringsten Wertigkeit zuerst gespeichert werden, wie dies bei GMP der Fall ist. Little-Endian-Prozessoren haben immer noch einen Vorteil für die wenigen Operationen (z. B. einige Zeichenfolgenkonvertierungen?), Die einfacher durch Lesen eines Bytes nach dem anderen ausgeführt werden können, da nur auf einem Little-Endian-System die Bytereihenfolge solcher Zahlen korrekt ist.
Vinc17
Little-Endian-Prozessoren haben einen Vorteil, wenn die Speicherbandbreite begrenzt ist, wie bei einigen 32-Bit-ARM-Prozessoren mit 16-Bit-Speicherbus oder dem 8088 mit 8-Bit-Datenbus: Der Prozessor kann nur die niedrige Hälfte laden und tun add / sub / mul ... während auf die höhere Hälfte
gewartet wird
13

Mit 8-Bit-Prozessoren war es sicherlich effizienter. Sie konnten eine 8- oder 16-Bit-Operation ausführen, ohne dass ein anderer Code benötigt wurde und ohne dass zusätzliche Werte gepuffert werden mussten.

Für einige Additionsoperationen ist es immer noch besser, wenn Sie jeweils ein Byte ausgeben.

Aber es gibt keinen Grund, warum Big-Endian natürlicher ist - im Englischen verwenden Sie dreizehn (Little Endian) und dreiundzwanzig (Big Endian).

Martin Beckett
quelle
1
Big-Endian ist für Menschen in der Tat einfacher, da die Bytes nicht neu angeordnet werden müssen. Beispielsweise wird auf einem PC 0x12345678gespeichert, wie 78 56 34 12auf einem BE-System 12 34 56 78(Byte 0 ist links, Byte 3 ist rechts). Beachten Sie, dass je größer die Zahl (in Bit) ist, desto mehr Austausch erforderlich ist. ein WORT würde einen Tausch erfordern; ein DWORD, zwei Pässe (drei Total Swaps); ein QWORD drei Durchgänge (insgesamt 7) und so weiter. Das heißt, (bits/8)-1Swaps. Eine andere Option ist das Vorwärts- und Rückwärtslesen (jedes Byte vorwärts lesen, aber das ganze # rückwärts scannen).
Synetech
Einhundertdreizehn ist entweder ein mittlerer Endian oder ein großer Endian, wobei "dreizehn" im Wesentlichen eine nicht dezimale Ziffer ist. Wenn wir Zahlen buchstabieren, gibt es einige geringfügige Abweichungen von den Konventionen zur konstanten Basis, die wir für Ziffern verwenden, aber wenn Sie diese Sonderfälle
herausnehmen,
@ Synetech- Zum Glück muss sich der Computer nicht darum kümmern, wie Menschen sie lesen. Das ist wie zu behaupten, dass NAND-Flash besser ist, weil ot '
Martin Beckett
1
@ Steve314, die buchstabierten Wörter von Zahlen spielen keine Rolle, es ist die numerische Anzeige, die wir beim Programmieren verwenden. Martin, kein Computer muss sich darum kümmern, wie Menschen Zahlen lesen, aber wenn es für Menschen einfach ist, sie zu lesen, wird das Programmieren (oder andere verwandte Arbeiten) einfacher und einige Fehler und Bugs können reduziert oder vermieden werden.
Synetech
@ steve314 Und auf Dänisch wird "95" als "fem halvfems" (fünf plus viereinhalb zwanzig) ausgesprochen.
Vatine
7

Die japanische Datumskonvention lautet "Big Endian" - JJJJ / MM / TT. Dies ist praktisch für Sortieralgorithmen, bei denen ein einfacher Zeichenfolgenvergleich mit der üblichen Regel verwendet werden kann, dass das erste Zeichen am höchsten ist.

Ähnliches gilt für Big-Endian-Zahlen, die in einem höchstwertigen Feld-zuerst-Datensatz gespeichert sind. Die Signifikanzreihenfolge der Bytes in den Feldern stimmt mit der Signifikanz der Felder im Datensatz überein, sodass Sie a memcmpzum Vergleichen von Datensätzen verwenden können. Dabei spielt es keine Rolle, ob Sie zwei Langwörter, vier Wörter oder acht separate Bytes vergleichen.

Wenn Sie die Reihenfolge der Felder ändern, erhalten Sie den gleichen Vorteil, jedoch nicht für Big-Endian, sondern für Little-Endian-Zahlen.

Dies hat natürlich nur eine sehr geringe praktische Bedeutung. Unabhängig davon, ob Ihre Plattform ein Big-Endian- oder ein Little-Endian-System ist, können Sie bei Bedarf Datensatzfelder bestellen, um diesen Trick auszunutzen. Es ist nur eine Qual, wenn Sie tragbaren Code schreiben müssen.

Ich kann auch einen Link zum klassischen Aufruf einfügen ...

http://tools.ietf.org/rfcmarkup?url=ftp://ftp.rfc-editor.org/in-notes/ien/ien137.txt

BEARBEITEN

Ein zusätzlicher Gedanke. Ich habe einmal eine große Integer-Bibliothek geschrieben (um zu sehen, ob ich das könnte), und dafür werden die 32-Bit-breiten Chunks in Little-Endian-Reihenfolge gespeichert, unabhängig davon, wie die Plattform die Bits in diesen Chunks anordnet. Die Gründe waren ...

  1. Viele Algorithmen beginnen auf natürliche Weise am niedrigstwertigen Ende zu arbeiten und möchten, dass diese Enden übereinstimmen. Beispielsweise propagieren die Überträge zusätzlich immer wichtigere Ziffern, so dass es sinnvoll ist, am niedrigstwertigen Ende zu beginnen.

  2. Ein Wert zu vergrößern oder zu verkleinern bedeutet lediglich, dass am Ende Teile hinzugefügt oder entfernt werden müssen, ohne dass Teile nach oben oder unten verschoben werden müssen. Möglicherweise ist aufgrund der Neuzuweisung des Speichers noch Kopieren erforderlich, jedoch nicht häufig.

Dies hat natürlich keine offensichtliche Bedeutung für Prozessoren - bis CPUs mit Hardware-Big-Integer-Unterstützung hergestellt werden, handelt es sich nur um eine Bibliothekssache.

Steve314
quelle
7

Niemand hat geantwortet, WARUM dies getan werden könnte, viele Dinge über die Konsequenzen.

Stellen Sie sich einen 8-Bit-Prozessor vor, der in einem bestimmten Taktzyklus ein einzelnes Byte aus dem Speicher laden kann.

Wenn Sie nun einen 16-Bit-Wert in das einzige 16-Bit-Register, dh den Programmzähler, laden möchten, ist dies auf einfache Weise möglich:

  • Laden Sie ein Byte vom Abrufort
  • Verschieben Sie dieses Byte um 8 Stellen nach links
  • Speicherabrufposition um 1 erhöhen
  • lade das nächste Byte (in den niederwertigen Teil des Registers)

das Ergebnis: Sie erhöhen immer nur den Abrufort, laden immer nur in den unteren Bereich Ihres breiteren Registers und müssen nur nach links verschieben können. (Natürlich ist das Verschieben nach rechts für andere Operationen hilfreich, so dass dies eine kleine Nebenschau ist.)

Dies hat zur Folge, dass die 16-Bit-Daten (Doppelbyte) in der Reihenfolge Most..Least gespeichert werden. Dh die kleinere Adresse hat das höchstwertige Byte - also Big Endian.

Wenn Sie stattdessen versuchen würden, mit Little Endian zu laden, müssten Sie ein Byte in den unteren Teil Ihres Wide-Registers laden, dann das nächste Byte in einen Staging-Bereich laden, es verschieben und dann in den oberen Teil Ihres Wide-Registers einfügen . Oder verwenden Sie eine komplexere Anordnung von Gattern, um selektiv in das obere oder untere Byte zu laden.

Das Ergebnis von Little Endian ist, dass Sie entweder mehr Silizium (Switches und Gates) oder mehr Operationen benötigen.

Mit anderen Worten, in Bezug auf das Geldverdienen in den alten Zeiten hat man mehr Geld für die meiste Leistung und die kleinste Siliziumfläche.

Heutzutage sind diese Überlegungen so gut wie irrelevant, aber Dinge wie das Füllen von Pipelines können immer noch eine große Sache sein.

Wenn es um das Schreiben von S / W geht, ist das Leben häufig einfacher, wenn Little-Endian-Adressen verwendet werden.

(Und die Big-Endian-Prozessoren sind in der Regel Big-Endian in Bezug auf die Bytereihenfolge und Little-Endian in Bezug auf die Bits in Bytes. Einige Prozessoren sind jedoch seltsam und verwenden sowohl die Big-Endian-Bitreihenfolge als auch die Bytereihenfolge. Dies macht das Leben sehr kompliziert Interessant für den H / W-Designer, der speicherabgebildete Peripheriegeräte hinzufügt, aber für den Programmierer keine andere Konsequenz hat.)

schnell_nun
quelle
3

Jimwise machte einen guten Punkt. Es gibt ein anderes Problem, in Little Endian können Sie Folgendes tun:

byte data[4];
int num=0;
for(i=0;i<4;i++)
    num += data[i]<<i*8; 

OR 

num = *(int*)&data; //is interpreted as

mov dword data, num ;or something similar it has been some time

Einfacher für Programmierer, die nicht vom offensichtlichen Nachteil vertauschter Speicherstellen betroffen sind. Ich persönlich finde, dass Big Endian umgekehrt zu dem ist, was natürlich ist :). 12 sollte als 21 gespeichert und geschrieben werden :)

Cem Kalyoncu
quelle
1
Dies beweist nur, dass es schneller / einfacher ist, in jedem für die CPU typischen Format zu arbeiten. Es sagt nichts darüber aus, ob es besser ist. Das gleiche gilt für Big - Endian: for(i=0; i<4; i++) { num += data[i] << (24 - i * 8); }entspricht move.l data, numauf einem Big - Endian - CPU.
Martin Vilcans
@ Martin: Eine Abziehung weniger ist in meinem Buch besser
Cem Kalyoncu
Das spielt eigentlich keine Rolle, da der Compiler die Schleife sowieso ausrollt. In jedem Fall verfügen viele CPUs über Anweisungen zum Austauschen von Bytes, um dieses Problem zu beheben.
Martin Vilcans
Ich stimme Bcoz auf Big Endian nicht zu, ich würde tun {num << = 8; num | = Daten [i]; } Zumindest muss die Anzahl der linken Schichten nicht mit mul
Hayri Uğur Koltuk berechnet werden.
@ali: Ihr Code wird die genaue Operation ausführen, die ich geschrieben habe, und wird auf Big Endian nicht funktionieren.
Cem Kalyoncu
1

Ich frage mich immer, warum jemand die Bytes in umgekehrter Reihenfolge speichern möchte

Dezimalzahlen sind Big Endian geschrieben. Es ist auch so, wie Sie es auf Englisch schreiben. Sie beginnen mit der höchstwertigen Ziffer und der nächsthöheren bis niedrigstwertigen. z.B

1234

ist eintausend, zweihundert und vierunddreißig.

Auf diese Weise wird Big Endian manchmal als natürliche Ordnung bezeichnet.

In Little Endian wäre diese Zahl eins, zwanzig, dreihundertviertausend.

Wenn Sie jedoch arithmetische Operationen wie Addition oder Subtraktion ausführen, beginnen Sie mit dem Ende.

  1234
+ 0567
  ====

Sie beginnen mit 4 und 7, schreiben die niedrigste Ziffer und merken sich den Übertrag. Dann addieren Sie 3 und 6 usw. Für Addition, Subtraktion oder Vergleich ist es einfacher zu implementieren, wenn Sie bereits Logik haben, um den Speicher in der richtigen Reihenfolge zu lesen, wenn die Zahlen umgekehrt sind.

Um Big Endian auf diese Weise zu unterstützen, benötigen Sie eine Logik, um den Speicher rückwärts zu lesen, oder Sie haben einen RISC-Prozess, der nur mit Registern arbeitet. ;)

Ein Großteil des Intel x86 / Amd x64-Designs ist historisch.

Peter Lawrey
quelle
0

Big-Endian ist nützlich für einige Operationen (Vergleiche von "Bignums" von Federn gleicher Oktettlänge). Little-Endian für andere (eventuell mit zwei "Bignums"). Am Ende hängt es davon ab, für was die CPU-Hardware eingerichtet wurde, normalerweise ist es das eine oder andere (einige MIPS-Chips waren, IIRC, beim Booten umschaltbar, um LE oder BE zu sein).

Vatine
quelle
0

Wenn nur Speicherung und Übertragung mit variablen Längen erforderlich sind, aber keine Arithmetik mit mehreren Werten, ist LE in der Regel einfacher zu schreiben und BE leichter zu lesen.

Nehmen wir eine Int-to-String-Konvertierung (und zurück) als spezifisches Beispiel.

int val_int = 841;
char val_str[] = "841";

Wenn das int in die Zeichenfolge konvertiert wird, ist die niedrigstwertige Ziffer leichter zu extrahieren als die höchstwertige Ziffer. Dies kann alles in einer einfachen Schleife mit einer einfachen Endbedingung erfolgen.

val_int = 841;
// Make sure that val_str is large enough.

i = 0;
do // Write at least one digit to care for val_int == 0
{
    // Constants, can be optimized by compiler.
    val_str[i] = '0' + val_int % 10;
    val_int /= 10;
    i++;
}
while (val_int != 0);

val_str[i] = '\0';
// val_str is now in LE "148"
// i is the length of the result without termination, can be used to reverse it

Versuchen Sie es jetzt gleich in BE-Reihenfolge. Normalerweise benötigen Sie einen anderen Divisor, der die größte Potenz von 10 für die bestimmte Zahl enthält (hier 100). Das müssen Sie natürlich erst finden. Viel mehr zu tun.

Die Konvertierung von String in Int ist in BE einfacher, wenn sie als umgekehrte Schreiboperation ausgeführt wird. Write speichert die höchstwertige Ziffer zuletzt, daher sollte sie zuerst gelesen werden.

val_int = 0;
length = strlen(val_str);

for (i = 0; i < length; i++)
{
    // Again a simple constant that can be optimized.
    val_int = 10*val_int + (val_str[i] - '0');
}

Machen Sie jetzt dasselbe in LE-Reihenfolge. Auch hier benötigen Sie einen zusätzlichen Faktor, der mit 1 beginnt und für jede Ziffer mit 10 multipliziert wird.

Daher bevorzuge ich normalerweise die Speicherung mit BE, da ein Wert genau einmal geschrieben wird, aber mindestens einmal und möglicherweise mehrmals gelesen wird. Wegen seiner einfacheren Struktur gehe ich normalerweise auch den Weg, um nach LE zu konvertieren, und kehre dann das Ergebnis um, selbst wenn der Wert ein zweites Mal geschrieben wird.

Ein weiteres Beispiel für die Speicherung in BE wäre die UTF-8-Codierung und vieles mehr.

Sichern
quelle