在ARM體系中,每個字單元包含4個字節(jié)單元或者兩個半字單元。在字單元中,4個字節(jié)哪一個是高位字節(jié),哪一個是低位字節(jié)則有兩種不同的格式:big-endian和little-endian格式。在小端模式中,低位字節(jié)放在低地址,高位字節(jié)放在高地址;在大端模式中,低位字節(jié)放在高地址,高位字節(jié)放在低地址。 如果將一個32位的整數(shù)0x12345678存放到一個整型變量(int)中,這個整型變量采用大端或者小端模式在內(nèi)存中的存儲由下表所示。
本文引用地址:http://m.butianyuan.cn/article/201611/319009.htm
地址偏移 | 大端模式 | 小端模式 |
0x00 | 12(OP0) | 78(OP3) |
0x01 | 34(OP1) | 56(OP2) |
0x02 | 56(OP2) | 34(OP1) |
0x03 | 78(OP3) | 12(OP0) |
如果將一個16位的整數(shù)0x1234存放到一個短整型變量(short)中。這個短整型變量在內(nèi)存中的存儲在大小端模式由下表所示。
地址偏移 | 大端模式 | 小端模式 |
0x00 | 12(OP0) | 34(OP1) |
0x01 | 34(OP1) | 12(OP0) |
由上表所知,采用大小模式對數(shù)據(jù)進(jìn)行存放的主要區(qū)別在于在存放的字節(jié)順序,大端方式將高位存放在低地址,小端方式將低位存放在低地址。
那么該如何判斷CPU是大端模式還是小端模式呢??
在C語言中,聯(lián)合體union的存放順序是所有成員都從低地址開始存放的。利用這一特點,可以用聯(lián)合體變量判斷ARM或x86環(huán)境下,存儲系統(tǒng)是是大端還是小端模式。
具體的代碼如下:
#include "stdio.h"
int main()
{
union w
{
int a; //4 bytes
char b; //1 byte
} c;
c.a=1;
if (c.b==1)
printf("It is Little_endian!/n");
else
printf("It is Big_endian!/n");
return 1;
}
評論