Types of endianness

后端 未结 8 1230
情话喂你
情话喂你 2020-12-04 22:57

What is the difference between the following types of endianness?

  • byte (8b) invariant big and little endianness
  • half-word (16b) invariant big and litt
相关标签:
8条回答
  • 2020-12-04 23:41

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

    Address 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
           |----|
           |    |
    
    At Addr=0:          Little-endian          Big-endian
    Read 1 byte:              0xaa                0xaa   (preserved)
    Read 2 bytes:           0xbbaa              0xaabb
    Read 4 bytes:       0xddccbbaa          0xaabbccdd
    

    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 |
    
    
    At Addr=0:             Little-endian              Big-endian
    Read 1 byte:                 0xaa                    0xdd
    Read 2 bytes:              0xbbaa                  0xddcc
    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 |
    
    
    At Addr=0:             Little-endian              Big-endian
    Read 1 byte:                 0xaa                    0xbb
    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 |
    
    
    At Addr=0:             Little-endian              Big-endian
    Read 1 byte:                 0xaa                    0x99
    Read 2 bytes:              0xbbaa                  0x9988
    Read 4 bytes:          0xddccbbaa              0x99887766
    Read 8 bytes:  0x99887766ddccbbaa      0x99887766ddccbbaa   (preserved)
    
    0 讨论(0)
  • 2020-12-04 23:41

    Best article I read about endianness "Understanding Big and Little Endian Byte Order".

    0 讨论(0)
提交回复
热议问题