Big vs. Little Endian

Aus C und Assembler mit Raspberry
Version vom 9. April 2025, 13:17 Uhr von Satyria (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Endian-Ness gibt an, wie Bytes in einem Speicherwort angeordnet sind. Die beiden gängigen Arten sind Big Endian und Little Endian. Diese Konzepte sind wichtig für das Verständnis, wie Daten in verschiedenen Systemen und Architekturen gespeichert und übertragen werden.

Little Endian

Definition

Bei Little Endian wird das „kleinste“ Byte des Speichers zuerst gespeichert, d.h., das niederwertigste Byte (Least Significant Byte - LSB) kommt an die niedrigste Speicheradresse.

Verwendung

Little Endian wird von den meisten gängigen Architekturen verwendet, einschließlich x86 (Intel) und ARM (unter Raspian/Linux und vielen anderen Betriebssystemen).

Beispiel (Little Endian)

Angenommen, wir haben die 32-Bit-Hexadezimalzahl 0x12345678.

Adresse Wert
0x0000 78
0x0001 56
0x0002 34
0x0003 12

Hier wird das LSB 78 an der niedrigsten Adresse 0x0000 gespeichert.

Big Endian

Definition

Bei Big Endian wird das „größte“ Byte des Speichers zuerst gespeichert, d.h., das höchstwertigste Byte (Most Significant Byte - MSB) kommt an die niedrigste Speicheradresse.

Verwendung

Big Endian ist weniger verbreitet, wird aber zum Beispiel von einigen Netzwerkanwendungen und älteren Mainframes verwendet.

Beispiel (Big Endian)

Angenommen, wir haben dieselbe 32-Bit-Hexadezimalzahl 0x12345678.

Adresse Wert
0x0000 12
0x0001 34
0x0002 56
0x0003 78

Hier wird das MSB 12 an der niedrigsten Adresse 0x0000 gespeichert.

Vergleich und Relevanz

Lesbarkeit/Wahrnehmung

Big Endian wird oft als "natürlicher" wahrgenommen, weil die Reihenfolge der Bytes der Reihenfolge der signifikanten Stellen entspricht.

Kompatibilität

Little Endian kann in manchen Anwendungen von Vorteil sein, z.B., wenn man mit 8-, 16-, oder 32-Bit-Werten arbeitet. Die Little Endian-Anordnung macht es einfacher, LSB-Operationen durchzuführen.

Anwendung unter Linux auf ARM

Linux basierende Betriebssysteme, die auf ARM-Prozessoren laufen, verwenden standardmäßig Little Endian.

Beispielcode in C zur Überprüfung der Endianess

#include <stdio.h>

int main() {
    unsigned int x = 0x12345678;
    char *c = (char*)&x;

    if (*c == 0x78) {
        printf("Little Endian\n");
    } else {
        printf("Big Endian\n");
    }

    return 0;
}

Praktische Überlegungen

  • Datenübertragung: Netzwerke (TCP/IP) nutzen Big Endian (Netzwerk-Byte-Reihenfolge). Systeme müssen sicherstellen, dass Daten korrekt umgewandelt werden, wenn sie zwischen Systemen mit unterschiedlicher Endianess gesendet werden.
  • Portabilität: Programme, die mit binären Daten arbeiten, müssen Endianess berücksichtigen, besonders wenn sie zwischen Systemen mit unterschiedlicher Endianess portiert werden.

Zusammenfassung

Endianess beschreibt die Reihenfolge der Byte-Speicherung von Zahlen im Speicher. Little Endian speichert die Bytes in aufsteigender Reihenfolge ihrer Signifikanz (LSB zuerst), während Big Endian die Bytes in absteigender Reihenfolge ihrer Signifikanz speichert (MSB zuerst). Linux-Systeme auf ARM-Prozessoren verwendet Little Endian. Verständnis der Endianess ist besonders wichtig bei der Netzwerkkommunikation, plattformübergreifenden Entwicklung und beim Arbeiten mit binären Daten.