http://blog.csdn.net/loulou_ff/article/details/3966010
嵌入式系統開發人員應該對Little-endian和Big-endian模式非常瞭解。例如,16bit寬的數0x1234在Little-endian模式CPU記憶體中的存放方式(假設從地址0x4000開始存放)為:
記憶體位址 |
0x4000 |
0x4001 |
存放內容 |
0x34 |
0x12 |
而在Big-endian模式CPU記憶體中的存放方式則為:
記憶體位址 |
0x4000 |
0x4001 |
存放內容 |
0x12 |
0x34 |
有時候,用C語言寫程式時需要知道是
大端模式還是小端模式。 所謂的
大端模式, 是指資料的低位儲存在記憶體的高地址中,而資料的高位,儲存在記憶體的低地址中;所謂的小端模式,是指資料的低位儲存在記憶體的低地址中,而資料的高位儲存在內
存的高地址中。為什麼會有大小端模式之分呢?這是因為在電腦系統中,我們是以位元組為單位的,每個地址單元都對應著一個位元組,一個位元組為8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位元大於8位的處理器,例 如16位或者32位的處理器,由於寄存器寬度大於一個位元組,那麼必然存在著一個如果將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。例如 一個16bit的short型x,在記憶體中的地址為0x0010,x的值為0x1122,那麼0x11為高位元組,0x22為低位元組。對於
大端模式,就將0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,剛好相反。我們常用的X86結構是小端模式,而KEIL
C51則為
大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬體來選擇是
大端模式還是小端模式。下面這段代碼可以用來測試一下你的編譯器是
大端模式還是小端模式:short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低地址單元
x1=((char*)&x)[1]; //高地址單元
若x0=0x11,則是大端; 若x0=0x22,則是小端......
[cpp]
view plaincopyprint?
- int main()
- {
- short int x;
- char x0,x1;
- x=0*((char*)&x);
//低地址單元 ,或者((char*)&x)[0];
- x1=*((char*)&x + 1); //高地址單元,或者((char*)&x)[1];
- printf("%x/n%x/n",x0,x1);
- }
int main()<br /> {<br />short int x;<br />char x0,x1;<br />x=0*((char*)&x); //低地址單元 ,或者((char*)&x)[0];<br />x1=*((char*)&x + 1); //高地址單元,或者((char*)&x)[1];<br />printf("%x/n%x/n",x0,x1);<br /> }[cpp]
view plaincopyprint?
- int checkCPU( )
- {
- {
- union w
- { int a;
- short b;
- } c;
- c.a = 0x12345678;
- return(c.b == 0x5678);
- }
- }
- int main()
- {
- printf("%d/n",checkCPU());
- }