我们在调试代码的时候经常会遇到大小端的情况,在x86体系下是使用的小端存储,在ARM体系下默认是小端,但是可以设置为大端模式,下面来介绍下大小端的区别
一个二进制数据0b 1000,0100,0001,1000(0x8418),数据高位:0x84,低位:0x18
经常有人以为数据在大小端模式下存储情况为:
地址 | 大端 | 小端 |
---|---|---|
0x20 | 0x84(1000,0100) | 0x18(0001,1000) |
0x21 | 0x18(0001,1000) | 0x21(0010,0001) |
到小端模式变为:0b 0001,1000,0010,0001
其中的误区是把大小端内存存储的最小单位设为了一个bit,但是正确的设置是一个byte(8bit),所以正确的内存存储为:
地址 | 大端 | 小端 |
---|---|---|
0x20 | 0x84 | 0x18 |
0x21 | 0x18 | 0x84 |
大端模式:高位数据存在低地址,低位数据存在高地址 小端模式:高位数据存在高地址,低位数据存在低地址
举例,一个int型数据0x12345678在不同模式下的存储情况: 数据位从高到低:0x12->0x34->0x56->0x78
地址 | 大端 | 小端 |
---|---|---|
0x20 | 0x12 | 0x78 |
0x21 | 0x34 | 0x56 |
0x22 | 0x56 | 0x34 |
0x23 | 0x78 | 0x12 |
拿一个union来举例最合适不过,假设一个联合体:
union { int a; chat b[4];} u;现在a = 0x12345678,那么数组b中的存储情况如下表:
b | 地址 | 大端 | 小端 |
---|---|---|---|
b[0] | 0x20 | 0x12 | 0x78 |
b[1] | 0x21 | 0x34 | 0x56 |
b[2] | 0x22 | 0x56 | 0x34 |
b[3] | 0x23 | 0x78 | 0x12 |
关于两者的优劣,已经好多人长篇大论分析了,但是偶看了许多,感觉没区别。。。。。。,理解了其实都是一样的
新闻热点
疑难解答