L'endianness d'un système définit dans quel ordre sont stockés les octets en mémoire.
En envisageant la mémoire comme un tableau:
En little endian, on commence par le poid faible (LSB=least significant byte).
--------------adresses mémoires -------->
0xDEADBEEF = EF BE AD DE
^ lsb ^ msb
En big endian, on commence par le poid fort (MSB=most significant byte)
--------------adresses mémoires -------->
0xCAFEC0DE = CA FE C0 DE
^ msb ^ lsb
Big endian (ppc, sparc, 68k...) paraît le plus intuitif à première vue, mais le little endian (x86, alpha...) a l'avantage de pouvoir accéder à l'octet de poid faible avec un accès mémoire de taille variable (genre si on a 0x1, en mémoire 01 00 00 00 donc, avec un movb al, $ADRESSE on retrouve bien 1, idem avec un movl eax, $ADRESSE). En big endian ça ne passe pas car le LSB change de place suivant la "largeur" du type utilisé. D'où le fameux test en C:
int test = 1;
if ( *(char *) test == 1) {
/* little endian */
} else {
/* big endian */
}
Il existe aussi des machines middle endian, des vieux vax je crois, qui utilisent une règle encore un peu plus tordue :)
[^] # Re: Ça a l'air stable
Posté par JaguarWan . En réponse au journal Driver NTFS pour linux avec lecture/ecriture. Évalué à 10.
En envisageant la mémoire comme un tableau:
En little endian, on commence par le poid faible (LSB=least significant byte).
--------------adresses mémoires -------->
0xDEADBEEF = EF BE AD DE
^ lsb ^ msb
En big endian, on commence par le poid fort (MSB=most significant byte)
--------------adresses mémoires -------->
0xCAFEC0DE = CA FE C0 DE
^ msb ^ lsb
Big endian (ppc, sparc, 68k...) paraît le plus intuitif à première vue, mais le little endian (x86, alpha...) a l'avantage de pouvoir accéder à l'octet de poid faible avec un accès mémoire de taille variable (genre si on a 0x1, en mémoire 01 00 00 00 donc, avec un movb al, $ADRESSE on retrouve bien 1, idem avec un movl eax, $ADRESSE). En big endian ça ne passe pas car le LSB change de place suivant la "largeur" du type utilisé. D'où le fameux test en C:
int test = 1;
if ( *(char *) test == 1) {
/* little endian */
} else {
/* big endian */
}
Il existe aussi des machines middle endian, des vieux vax je crois, qui utilisent une règle encore un peu plus tordue :)