Home

Big e little endian: Ordinamento dei byte

In questo articolo cerco di spiegare cosa significa endianess, big endian, small endian e perchè ci interessa in quanto programmatori C.

L'endianess fa riferimento al modo in cui un computer salva valori nella memoria centrale (comunemente chiamata RAM). In particolare la componente che determina questa caratteristica è la CPU perchè è lei quella che mette i valori nella memoria.

Questo è il genere di concetto incomprensibile senza fare esempi, quindi facciamone uno. Supponiamo di avere un intero a 32 bit (4 byte) tale da essere rappresentato in base 2 (in binario) come la successione degli ottetti N = A B C D. Ad esempio se N è 123456 in base 10, allora in base 2 è 00000000 00000001 11100010 01000000, quindi in tal caso A = 00000000, B = 00000001, C = 11100010 e D = 01000000.

Tuttavia non è ovvio come si dovrebbe salvare questa sequenza di byte in memoria. Supponiamo di voler salvare N all'indirizzo di memoria P. Un computer potrebbe salvare N come

P - 1 P P + 1 P + 2 P + 3 P + 4
... A B C D ...

oppure come

P - 1 P P + 1 P + 2 P + 3 P + 4
... D C B A ...

nel primo caso all'indirizzo P è salvato il byte può significativo, mentre a P + 3 quello meno significativo. Nel secondo caso avviene tutto l'inverso. Quando un computer salva il byte più significativo all'indirizzo più basso (il primo caso), allora è detto little endian. Nel secondo caso si chiama big endian.

Questo problema accade solo quando il processore ha a che fare con tipi di dato più grandi di un byte. La rappresentazione big e little endian di un byte è la stessa.

Questo problema ci interessa ogni volta che delle informazioni devono essere trasferite da un computer ad un altro, dato che potrebbero avere ordinamenti differenti. Ad esempio questo accade quando si ha una rete di computer oppure si scrivono file in formato binario (che potrebbero essere spostati ad un altro computer).

La soluzione a questo problema è di scegliere l'endianess del mezzo di comunicazione.

Un modo per evitare mal di testa relativi a questo problema è quello di progettare formati in modo da usare solo symboli grandi un byte, in modo tale che le rappresentazioni big e small endian coincidano. Ad esempio questo è quel che fa HTTP usando richieste ASCII.