大端小端问题真是困扰了我很久,从业都第10年了,从事软件也5年了,每次遇到大端小端都得百度一下,再从头理解一下。我记录了好多晦涩难懂的话,比如:
1.小端:信号的高位放在高字节的高位,信号的低位放在低字节的低位。
2.大端:信号的高位放在低字节的高位,信号的低位放在高字节的低位。
从这两句话中我最大的理解就是,小端的bit顺序和寄存器的顺序相同。大端的bit顺序和寄存器相反。
然后我们看看下面的例子是大端还是小端:这里是一个FIFO缓存结构,地址是向下生长的。
Address | Data |
S0076 | P1 MSB |
S0077 | P1 LSB |
S0078 | P2 MSB |
S0079 | P2 LSB |
S0080 | P3 MSB |
S0081 | P3 LSB |
。。。 | |
。。。 |
从这个例子中可以看出数据的高位在低地址,数据的低位在高地址,是大端。
我们再看看小端的样子:
Address | Data |
S0076 | P1 LSB |
S0077 | P1 MSB |
S0078 | P2 LSB |
S0079 | P2 MSB |
S0080 | P3 LSB |
S0081 | P3 MSB |
。。。 | |
。。。 |
从这个例子中可以看出数据的高位在高地址,数据的低位在低地址,是小端。
所以我经常说小端是看着顺眼的,大端是看着别扭的。STM32就是小端的存储方式,飞思卡尔5604就是大端的存储方式。
再看一个例子
寄存器 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
小端 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
大端 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
寄存器bit方向如图所示,里面的数据排列如图所示,但是小端和大端读出来的数却是不一样的,小端读出来的数是0x8888,大端读出来的数是0x1111。
小端就相当于是0x8888的高位MSB开始从寄存器的BIT0开始向左移位,移位到BIT15;
大端就相当于是0x1111的高位MSB开始从寄存器的BIT15开始向右移位,移位到BIT0;
希望我这次没有理解错,对初学者也能有所帮助。