ENDIANESS |
Le
informazioni possono essere memorizzate all’interno della memoria centrale in
due modalità differenti (endianess):
big endian le informazioni, la
cui memorizzazione occupa più di un byte (word, double word) sono memorizzate in
celle consecutive della memoria, in maniera tale che il byte più significativo
dell’informazione viene memorizzato nella cella di memoria con indirizzo più
basso, mentre quello meno significativo viene memorizzato nella cella di memoria
con indirizzo più alto. Se si osserva il contenuto della memoria centrale con
indirizzi crescenti da sinistra verso destra, i byte appaiono memorizzati
nell’ordine canonico.
little endian: le informazioni, la cui memorizzazione occupa più di un byte (word, double word) sono memorizzate in celle consecutive della memoria, in maniera tale che il byte più significativo dell’informazione viene memorizzato nella cella di memoria con indirizzo più alto, mentre quello meno significativo viene memorizzato nella cella di memoria con indirizzo più basso. Se si osserva il contenuto della memoria centrale con indirizzi crescenti da sinistra verso destra, i byte appaiono memorizzati al rovescio (all’interno di ogni byte i bit sono comunque nell’ordine canonico). Questa modalità di memorizzazione delle informazioni è utilizzata su architetture basate su X386.
Sui PC (architetture Intel X386 e compatibili) e sulle piattaforme Digital, le
informazioni sono memorizzate secondo la convenzione little endian, mentre tutte
le altre piattaforme (Motorola, IBM, Sun) utilizzano la convenzione big endian.
Esistono anche dei processori che permettono di passare da un tipo di
memorizzazione all’altro.
È possibile verificare l’endianess utilizzata dal proprio sistema, attraverso un
semplice programma, analogo a quello di seguito riportato (sorgente C):
#include <stdio.h> int endianess(void) /* Return value: * 0 : big endian * 1 : little endian */ { short int TestValue, RebuiltValue; char *pValue; TestValue = 0xABCD; pValue = (char*)&TestValue; RebuiltValue = (pValue[1] << 8) + (0x00ff & pValue[0]); return (TestValue == RebuiltValue); } main() { if (endianess() == 0) printf("Il sistema utilizza big endian.\n"); else printf("Il sistema utilizza little endian.\n"); return(0); } |