關於大端小端的概念,小端:數據的高位字節存放在高地址內,數據的低位字節存放在低地址內。
大端:數據的高位字節存放在低地址內,數據的低位字節存放在高地址內。
典型的體系結構中,一個字是4個字節,那么數據0x0A0B0C0D,在小端機器中從地址到高址的存放方式為:0x0D,0x0C,0x0B,0x0A;
在大端模式中從地址到高地址的存放方式為:0x0A,0xB,0x0C,0x0D;
通用處理器中,ARM通常是大端模式,x86體系機構是小端模式。
如果讓你判斷一個處理器的類型,你該如何編碼實現呢,如果是用匯編語言,那這是一件非常容易的事情,向指定地址寫一個數據,
再逐個字節的讀出來,就能很容易判斷出大小端。那么用C語言如何實現呢?
方法一、通過讀取同一地址的整型數據和字符數據來區別大端和小端

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的共享內存特性,來判斷機器類型

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的開發者,在內核中只用這樣兩句話,就判斷了機器類型

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