Was ist Big-Endian und Little-Endian?
Warum die Byte-Speicherreihenfolge umkehren?
Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.
Beim Codieren haben Sie möglicherweise Daten über das Netzwerk gesendet oder eine bestimmte Datei gelesen. Es gibt Fälle, in denen der Wert völlig anders ausfällt, als ich erwartet habe. Der offizielle Name für dieses Phänomen ist Endianness-Anordnungsmethode. Das heißt, sie werden Big Endian und Little Endian genannt.
Wenn die CPU 4-Byte-Daten vom Typ „int“ im Speicher speichert, packt sie diese nicht als Ganzes, sondern zerlegt sie in 1-Byte-Blöcke und speichert sie der Reihe nach an der Adresse. Zu diesem Zeitpunkt hängt es davon ab, ob Sie die Reihenfolge beginnend mit der größten Ziffer (MSB) oder in umgekehrter Reihenfolge beginnend mit der kleinsten Ziffer (LSB) anordnen. Die Art und Weise, wie Daten im Speicher abgelegt werden, ist völlig anders.
Wenn Sie die Zahlen in einer intuitiven Reihenfolge anordnen, so als ob eine Person sie lesen würde, sind sie Big-Endian, und wenn Sie sie in umgekehrter Reihenfolge anordnen, damit Maschinen sie leichter berechnen können, sind sie Little-Endian. Die meisten modernen PCs, wie zum Beispiel die von uns hauptsächlich verwendeten Intel- oder AMD-CPUs, nutzen das Little-Endian-System.
Lassen Sie es uns selbst anhand des Codes überprüfen.
#include <iostream>
#include <iomanip>
int main() {
//4 Byte hexadezimale Ganzzahldaten
unsigned int number = 0x12345678;
//Wirft einen Zeiger um, um zu überprüfen, wie jedes Byte im Speicher gespeichert ist
unsigned char* bytePtr = reinterpret_cast<unsigned char*>(&number);
for (int i = 0; i < sizeof(int); ++i) {
std::cout << "&bytePtr[" << i << "] : 0x"
<< std::hex << std::setw(2) << std::setfill('0')
<< (int)bytePtr[i] << std::endl;
}
/*
* Basierend auf dem Little-Endian-System
* &bytePtr[0] : 0x78 //Die kleinste Einheit (LSB) geht zuerst an die niedrigste Adresse
* &bytePtr[1] : 0x56
* &bytePtr[2] : 0x34
* &bytePtr[3] : 0x12
*
* Basierend auf dem Big-Endian-System
* &bytePtr[0] : 0x12 //Die größte Einheit (MSB) geht zuerst an die niedrigste Adresse.
* &bytePtr[1] : 0x34
* &bytePtr[2] : 0x56
* &bytePtr[3] : 0x78
*/
return 0;
}
Hier stellt sich eine Frage. Der gleiche Wert wird trotzdem gespeichert, Warum haben sie eine unintuitive Methode zur verkehrten Speicherung von Daten übernommen, wie zum Beispiel Little Endian? Dies ist auf das Design des Addierers innerhalb der CPU und die Effizienz der Typumwandlung zurückzuführen.
Wenn die CPU zwei Zahlen addiert oder subtrahiert, muss sie von der Einsenstelle, also der kleinsten Ziffer, aus rechnen, um den Übertrag durchzuführen. In Little Endian befindet sich die kleinste Einheit (LSB) an der ersten Adresse im Speicher. Sobald die CPU den Speicher liest, kann sie sofort mit der Ausführung von Rechenoperationen beginnen. Auch beim Downcasting durch Abschneiden einer 4-Byte-Ganzzahl auf 1 Byte (char), Die Hardwarelogik wird erheblich vereinfacht, da nur die Startadresse des Speichers ohne zusätzliche Adressberechnung extrahiert werden muss.
Andererseits ist Big-Endian für Menschen intuitiv lesbar, wenn sie sich den Speicherauszug ansehen. Wenn man die Größe zweier Zahlen vergleicht, hat man den Vorteil, dass man von der ersten Ziffer an vergleichen kann. Um Verwirrung beim Datenaustausch zu vermeiden, Bei Netzwerkstandardkommunikationen wie dem Internetprotokoll (TCP/IP) wird Big-Endian als Standard verwendet.