Big-Endian und Little-Endian
Eine umfangreiche Beschreibung zum Thema findet man auf der Seite von Jürgen Wolf:
http://pronix.linuxdelta.de/C/standard_C/c_programmierung_19_3.shtml
Hier ist eine kleine Zitat aus dem durch den o.g. Link referenzierten Text:
Little-Endian und Big-Endian unterscheiden sich durch die Anordnung des most significant byte und des least significant byte. Bei einer Word-Größe der CPU von vier Bytes wird das rechte Ende als least significant byte und das linke Ende als most significant byte bezeichnet. Das least significant byte stellt dabei die niedrigeren Werte und das most significant byte die größeren Werte in einem Word dar.
Als Beispiel dient jetzt folgende Hex-Zahl:
22CCDDEE
Auf den unterschiedlichen Systemen wird diese Hex-Zahl im Speicher folgendermaßen abgelegt:
Adresse | 0x12345 | 0x12346 | 0x12347 | 0x12348 |
---|---|---|---|---|
Big-Endian | 22 | CC | DD | EE |
Little-Endian | EE | DD | CC | 22 |
Wie man herausfindet, auf was für einem System das Programm ausgeführt wird, wird mit einem Beispiel (§19.17.3) unter dem o.g. Link erklärt.
Zu den Little-Endian-Systemen gehören z.B.:
- Intel CPUs (x86, x64 bzw. x86_x64)
- DEC Alpha
- VAX
Und einige Big-Endian-Systeme:
- Motorola MC68000 (Amiga, Atari)
- SPARC CPUs (SUN)
- IBM PowerPC
Quelle: http://pronix.linuxdelta.de/C/standard_C/c_programmierung_19_3.shtml (von Jürgen Wolf)
Byte- und Bit-Order, CPU IA-32 (little endian):
Quelle: http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-2a-manual.html
Hier ist ein Beispiel, wie man prüft welches Endianess das System hat (der Code muss auf dem Zielsystem übersetzt werden):
#include <stdio.h> #define is_bigendian() ((*(char*)&i) == 0) int main (void) { const int i = 1; printf("Endianess = %s-Endian\n", is_bigendian() ? "BIG" : "LITTLE"); return 0; } // main()
Stand: 06.09.2016
EOF