大端模式和小端模式

发布时间 2023-03-31 14:47:53作者: moonのsun

1. 定义

这是个老生常谈的问题,定义大家都懂:

大端模式:数据低位存放在内存高位

小端模式:数据高位存放在内存高位

 

2. 数据高低位 VS 地址高低位

比如一个十进制数字:12345678

数据低位就是数据的右边,数据高位就是数据的左边;

地址低位就是地址的左边,地址高位就是地址的右边。

假如一页纸表示内存的话,大端模式刚好符合我们平时写字的习惯:地址低位存放数据高位。

 

3. 大小端的单位:Byte VS bit

很多文档都提到过,大小端是以字节为单位的,我之前也是这样认为的。

假如大小端以字节为单位,那么一个字节内部的bit是如何排列呢?是bit7, bit6, ... bit0?

非也!其实大小端本质上指的是一个 变量内部 数据高低位与地址高低位的的排列关系

比如0x1234,大端模式排列为:0001 0010 0011 0100,小端模式排列就是bit完全反过来:0010 1100 0100 0001.

 

认识到这个很重要,特别是遇到按bit定义变量的时候。

比如信息传输的时候,一个字节按照bit划分为几部分:

Byte0
    7~5: a
    4~0: b
Byte1
    c

大端模式就需要这么定义结构体:地址低位(先写的、左边的)存放变量高位(a):

struct S {
    uint8 a : 3;
    uint8 b : 5;
    uint8 c;
}

小端模式就需要这么定义结构体:地址低位(先写的、左边的)存放变量低位(b):

struct S {
    uint8 b : 5;
    uint8 a : 3;
    uint8 c;
}