天天看點

處理器的大端和小端模式

 大端格式:

在這種格式中,字資料的高位元組存儲在低位址中,而字資料的低位元組則存放在高位址中。

小端格式:

與大端存儲格式相反,在小端存儲格式中,低位址中存放的是字資料的低位元組,高位址存放的是字資料的高位元組。

 請寫一個C函數,若處理器是Big_endian的,則傳回0;若是Little_endian的,則傳回1

解答:

int checkCPU( )

{

    {

           union w

           {  

                  int  a;

                  char b;

           } c;

           c.a = 1;

           return(c.b ==1);

    }

}

剖析:

嵌入式系統開發者應該對Little-endian和Big-endian模式非常了解。例如,16bit寬的數0x1234在Little-endian模式CPU記憶體中的存放方式(假設從位址0x4000開始存放)為:

記憶體位址

0x4000

0x4001

存放内容

0x34

0x12

而在Big-endian模式CPU記憶體中的存放方式則為:

32bit寬的數0x12345678在Little-endian模式CPU記憶體中的存放方式(假設從位址0x4000開始存放)為:

0x4002

0x4003

0x78

0x56

聯合體union的存放順序是所有成員都從低位址開始存放。

=============== 呵呵 還是附上 另一段代碼吧,摘自一個開源項目 ====

int  big_endian (void)

     {

       union{

          long l;

          char c[sizeof(long)];

       }u;

       u.l = 1;

       return  (u.c[sizeof(long) - 1] == 1);

     }

有時候,用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,則是小端......

下一篇: ARM基礎(1)

繼續閱讀