ENDIANESS

(tratto dal sito:http://www.giobe2000.it/Tutorial/Cap01/Pag/cap01-01.asp)

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);
}