大端(Big-endian):数据的高位字节存放在地址的低端 低位字节存放在地址高端;
小端(Little-endian):数据的高位字节存放在地址的高端 低位字节存放在地址低端;
举个简单而又容易理解的例子:
uint_16 temp = 0x12345678;
地址 | 大端 | 小端0 |
---|---|---|
0x00001 | 0x12 | 0x78 |
0x00002 | 0x34 | 0x56 |
0x00003 | 0x56 | 0x34 |
0x00004 | 0x78 | 0x12 |
而与大小端类似的,还有MSB和LSB存储方式。
LSB(Least Significant Bit),意为最低有效位;
MSB(Most Significant Bit),意为最高有效位。通常,一个芯片的管脚中,对于一个多比特的信号,比如32根的地址线,从低开始按0到31编个号。MSB就是31,LSB就是0。那么如果标记为:ADDR[31:0]就是MSB first的方式,如果标记为ADDR[0:31]就是LSB first的方式。LSB和MSB是以机器码为单位进行排序。
这样就可以显而易见看出,大小端和LSB MSB本质区别是在排序的单位不同,在芯片中应当留意寄存器是否有LSB或者MSB的字样,有的话应当对数据的序列进行改写,这几天就被这坑,坑了一段时间,因为之前一直没有接触过LSB和MSB,可是接触过大小端的概念,先入为主的想法,让我在一个简单的问题困扰许久。现在才发现理论知识是相当重要,特别是许多数据手册上它们对一些常识是有时候没有进行说明的,因此,这就需要我们平时多积累,网上也是没有大神特别整理这些常识性的东西。开源资料较少,这个我感觉就是硬件编程比软件编程比较明显鸡肋的地方吧。。。