# Types of endianness

There are two approaches to endian mapping: address invariance and data invariance.

In this type of mapping, the address of bytes is always preserved between big and little. This has the side effect of reversing the order of significance (most significant to least significant) of a particular datum (e.g. 2 or 4 byte word) and therefore the interpretation of data. Specifically, in little-endian, the interpretation of data is least-significant to most-significant bytes whilst in big-endian, the interpretation is most-significant to least-significant. In both cases, the set of bytes accessed remains the same.

Example

Address invariance (also known as byte invariance): the byte address is constant but byte significance is reversed.

Addr   Memory
7    0
|    |    (LE)   (BE)
|----|
+0    | aa |    lsb    msb
|----|
+1    | bb |     :      :
|----|
+2    | cc |     :      :
|----|
+3    | dd |    msb    lsb
|----|
|    |

Read 1 byte:              0xaa                0xaa   (preserved)


## Data Invariance

In this type of mapping, the relative byte significance is preserved for datum of a particular size. There are therefore different types of data invariant endian mappings for different datum sizes. For example, a 32-bit word invariant endian mapping would be used for a datum size of 32. The effect of preserving the value of particular sized datum, is that the byte addresses of bytes within the datum are reversed between big and little endian mappings.

Example

32-bit data invariance (also known as word invariance): The datum is a 32-bit word which always has the value 0xddccbbaa, independent of endianness. However, for accesses smaller than a word, the address of the bytes are reversed between big and little endian mappings.

Addr                Memory

| +3   +2   +1   +0 |  <- LE
|-------------------|
+0      msb | dd | cc | bb | aa |  lsb
|-------------------|
+4      msb | 99 | 88 | 77 | 66 |  lsb
|-------------------|
BE ->  | +0   +1   +2   +3 |

Read 4 bytes:          0xddccbbaa              0xddccbbaa   (preserved)
Read 8 bytes:  0x99887766ddccbbaa      0x99887766ddccbbaa   (preserved)


Example

16-bit data invariance (also known as half-word invariance): The datum is a 16-bit
which always has the value 0xbbaa, independent of endianness. However, for accesses smaller than a half-word, the address of the bytes are reversed between big and little endian mappings.

Addr           Memory

| +1   +0 |  <- LE
|---------|
+0      msb | bb | aa |  lsb
|---------|
+2      msb | dd | cc |  lsb
|---------|
+4      msb | 77 | 66 |  lsb
|---------|
+6      msb | 99 | 88 |  lsb
|---------|
BE ->  | +0   +1 |

Read 2 bytes:              0xbbaa                  0xbbaa   (preserved)
Read 4 bytes:          0xddccbbaa              0xddccbbaa   (preserved)
Read 8 bytes:  0x99887766ddccbbaa      0x99887766ddccbbaa   (preserved)


Example

64-bit data invariance (also known as double-word invariance): The datum is a 64-bit
word which always has the value 0x99887766ddccbbaa, independent of endianness. However, for accesses smaller than a double-word, the address of the bytes are reversed between big and little endian mappings.

Addr                         Memory

| +7   +6   +5   +4   +3   +2   +1   +0 |  <- LE
|---------------------------------------|
+0      msb | 99 | 88 | 77 | 66 | dd | cc | bb | aa |  lsb
|---------------------------------------|
BE ->  | +0   +1   +2   +3   +4   +5   +6   +7 |