字節序問題:大小端的判定

    大小端的判斷很簡單,可判斷了有什麼用呢?這是一個難纏的問題,我最近就碰到了這樣一個問題,比如,int a = 0x12345678,char* p = &a,那麼p[0]等於多少呢?答案要麼是0x12,要麼是0x78,對吧,如果你知道他是小端(因爲地球人都知道偷笑),那麼你肯定就知道p[0] = 0x78,呵呵,換句話說,理解大小端對指針的運用還是有一定幫助的。

 

一、大小端概念

    要判斷電腦的大小端,肯定先要理解大小端的概念:

    大端模式(Big-Endian),是指數據的高位,保存在內存的低地址中,而數據的低位,保存在內存的高地址中,即高低高低

    小端模式(Little-Endian),是指數據的高位,保存在內存的高地址中,而數據的低位,保存在內存的低地址中,即高高低低

 

二、爲什麼要有大小端模式之分?

    這是因爲在計算機系統中,我們是以字節爲單位的,每個地址單元都對應着一個字節,一個字節爲 8bit。但是在C語言中除了8bitchar之外,還有16bitshort型,32bitlong型(要看具體的編譯器),另外,對於位數大於 8位的處理器,例如16位或者32位的處理器,由於寄存器寬度大於一個字節,那麼必然存在着一個如果將多個字節安排的問題。因此就導致了大端存儲模式和小端存儲模式。例如一個16bitshortx,在內存中的地址爲0x0010x的值爲0x1122,那麼0x11爲高字節,0x22爲低字節。對於大端模式,就將0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,剛好相反。我們常用的X86結構是小端模,而KEIL C51則爲大端模式。很多的ARMDSP都爲小端模式。有些ARM處理器還可以由硬件來選擇是大端模式還是小端模式。

 

三、判斷大小端的方法

方法一(強轉):

 int i = 0x12345678;

  char ch = (char)i;  //強轉

  if(0x12 == ch)

  {

      //大端  

  }

  if(0x78 == ch)

  {

      //小端

  }

 

方法二(共用體):

union A{

     int i;

     char ch;  

}a;

  a.i = 0x12345678;

  if(0x12 == a.ch)

  {

       //大端  

  }

  if(0x78 == a.ch)

  {

       //小端

  }

 

默認爲小端模式

 

發佈了68 篇原創文章 · 獲贊 89 · 訪問量 53萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章