大小端存儲判斷

完整C代碼如下:

int endian_test(void)
{
  char tmp[4]={1,0,0,0};
  return (*(int *)tmp)==1;
}
其中tmp[4]爲測試數組,大小爲4*8bit=32bit,剛好爲一個int類型變量的存儲大小
在函數中先把char類型的指針tmp強制轉換爲int類型,那麼以前tmp數組中存放的4個char類型的數據則變爲一個int類型的數據
如果才一那個小端存儲方式的話,則函數返回1,否則返回0;由此可以判斷是大端存儲還是小端存儲

======================================================================================================

相信大家都知道大端存儲和小端存儲的概念,這在平時,我們一般不用考慮,但是,在某些場合,這些概念就顯得很重要,比如,在 Socket 通信時,我們的電腦是小端存儲模式,可是傳送數據或者消息給對方電腦時,恰巧,對方的電腦是大端存儲,那麼,如果你直接的傳輸,那麼對方解析的肯定就是亂碼了,所以,我們需要在傳輸數據之前轉換成網絡順序。

     這篇文章的目的不是解決上述的處理字節順序的問題,而是,用C語言實現測試電腦的字節存儲順序。

     在C語言中有一種結構--Union,被稱爲“共用體”,它可以像struct一樣存儲不同類型的數據,但是它在內存中所佔的大小是最大的數據類型所佔的字節數(這裏不考慮字節對齊的問題)。由此,我們可以利用這個數據類型判斷了。

     具體方法如下:

     假如,現在我們存儲一個整型的變量,由於這個整型的變量佔4個字節,所以,它在計算機中的存儲應該是這個樣子:

                   (0x)0001        低地址--->高地址   大端存儲

                   (0x)0001        高地址<---低地址   小端存儲

所以,我們可以取得低地址的數據,測試是1或者是0,如果是1,那麼就是小端存儲,如果是0,那麼就是大端存儲。

     下面,給出測試代碼:

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. void checkSystemBigOrLittle(void);  
  5.   
  6. int main(void)  
  7. {  
  8.     checkSystemBigOrLittle();  
  9.   
  10.     system("pause");  
  11.     return 0;  
  12. }  
  13.   
  14. void checkSystemBigOrLittle(void)  
  15. {  
  16.     typedef union MyUnion  
  17.     {  
  18.         int i;  
  19.         char c;  
  20.     };  
  21.   
  22.     MyUnion mu;  
  23.   
  24.     mu.i = 1;  
  25.   
  26.     if(mu.c == 1)  
  27.     {  
  28.         cout<<"你的電腦是小端存儲模式。。。"<<endl;  
  29.     }  
  30.     else if (mu.c == 0)  
  31.     {  
  32.         cout<<"你的電腦是大端存儲模式。。。"<<endl;  
  33.     }  
  34.     else  
  35.     {  
  36.         cout<<"很抱歉,出錯了。。。"<<endl;  
  37.     }  
  38. }  

在我的電腦上運行的截圖如下:

 

由此可見,我的電腦是“小端存儲”模式,所以,用這種方法,可以獲取電腦的數據存儲模式。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章