我們在調試代碼的時候經常會遇到大小端的情況,在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 |
關于兩者的優劣,已經好多人長篇大論分析了,但是偶看了許多,感覺沒區別。。。。。。,理解了其實都是一樣的
新聞熱點
疑難解答