Endianess is the byte order of the number in the computer's memory. The number can have any size of bits, but the most common numbers used are 32 bits (4 bytes) and 16 bits (2 bytes).
There are 2 main types of endianess:
Little endian number is ordered from the least significant byte (LSB) in low memory address to the most significant byte (MSB) in high memory address.
Address offset | Data |
---|---|
0 | byte0 |
1 | byte1 |
2 | byte2 |
3 | byte3 |
The hex number 0x0D0C0B0A will be represented in memory:
Address offset | Data |
---|---|
0 | 0A |
1 | 0B |
2 | 0C |
3 | 0D |
Big endian number is ordered from the most significant byte (MSB) in low memory address to the least significant byte (LSB) in high memory address.
Address offset | Data |
---|---|
0 | byte3 |
1 | byte2 |
2 | byte1 |
3 | byte0 |
The hex number 0x0D0C0B0A will be represented in memory:
Address offset | Data |
---|---|
0 | 0D |
1 | 0C |
2 | 0B |
3 | 0A |
The order of the bits inside the byte is not changed when converting from little to big or from big to little.
Many processors allow to configure the endianess type to little endian or big endian.
Machine / Processor | Endianess |
---|---|
Intel Pentium / x86 (PC) | Little |
ARM | Little / Big |
PowerPC | Big / Little |
Motorola 68000 | Big |
MIPS | Big / Little |
Sun Sparc | Big / Little |
TI TMS320C6000 | Big / Little |
Analog ADMC / Sharc | Big |
Java | Big |
Network | Big |
PC / Windows | Little |
Mac / OS-X | Big / Little |
Linux | Big / Little |
Unix | Big / Little |
TBD
The conversion is done, simply by swapping the bytes in memory for a 32 bit number.
Byte0 is swapped with byte3. Byte1 is swapped with byte2.
The conversion works both ways - from big to little and from little to big.
unsigned long EndianSwap32(unsgined long x)
{
unsigned long y=0;
y += (x & 0x000000FF)<<24;
y += (x & 0xFF000000)>>24;
y += (x & 0x0000FF00)<<8;
y += (x & 0x00FF0000)>>8;
return y;
}
void EndianSwap32(unsgined char c[])
{
unsigned char tmp;
tmp = c[0];
c[0] = c[3];
c[3] = tmp;
tmp = c[1];
c[1] = c[2];
c[2] = tmp;
}
Here is a C code function to finds the endianess of the CPU:
typedef enum _endian {little_endian, big_endian} EndianType;
EndianType CheckCPUEndian()
{
unsigned short x;
unsigned char c;
EndianType CPUEndian;
x = 0x0001;;
c = *(unsigned char *)(&x);
if( c == 0x01 )
CPUEndian = little_endian;
else
CPUEndian = big_endian;
return CPUEndian;
}