如何判斷一個機器是大端還是小端


 

    關於大端小端的概念,小端:數據的高位字節存放在高地址內,數據的低位字節存放在低地址內。

                                大端:數據的高位字節存放在低地址內,數據的低位字節存放在高地址內。

    典型的體系結構中,一個字是4個字節,那么數據0x0A0B0C0D,在小端機器中從地址到高址的存放方式為:0x0D,0x0C,0x0B,0x0A;

   在大端模式中從地址到高地址的存放方式為:0x0A,0xB,0x0C,0x0D;

   通用處理器中,ARM通常是大端模式,x86體系機構是小端模式。

   如果讓你判斷一個處理器的類型,你該如何編碼實現呢,如果是用匯編語言,那這是一件非常容易的事情,向指定地址寫一個數據,

   再逐個字節的讀出來,就能很容易判斷出大小端。那么用C語言如何實現呢?  

    方法一、通過讀取同一地址的整型數據和字符數據來區別大端和小端    

View Code
 1  unsigned int data,* point;
 2     point=&data;//獲取整型數據的地址,保存在point中
 3     data=0;
 4     *(type *) point= 0x22;
 5     if(data==0x22)
 6     {
 7         cout<< "此處理器是小端!"<<endl;
 8     }
 9     else  if(data==0x22000000)
10     {
11         cout<< "此處理器是大端!"<<endl;
12     }
13     else
14     {
15         cout<< "暫時無法判斷機器類型!"<<endl;
16     }

 

 

    方法二、通過union的共享內存特性,來判斷機器類型    

View Code
 1  union
 2     {
 3         char str;
 4         int data;
 5     };
 6     data=0x01020304;
 7     if(str==0x01)
 8     {
 9         cout<< "此機器是大端!"<<endl;
10     }
11     else if(str==0x04){
12         cout<<"此機器是小端!"<<endl;
13     }
14     else{
15         cout <<" 暫無法判斷此機器類型!"<<endl;
16     }

 

 

    方法三、Linux的開發者,在內核中只用這樣兩句話,就判斷了機器類型

View Code
1  static union { char c[4]; unsigned long mylong; } endian_test = {{ 'l', '?', '?', 'b' } };
2     #define ENDIANNESS ((char)endian_test.mylong)
3     cout<<ENDIANNESS<<endl;

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM