判斷系統大小端方法分析與總結

2021-09-22 05:10:56 字數 1388 閱讀 8086

情況1:利用陣列型別

#include 

int checksystem()  

int main()    

情況2:利用位移運算

int i = 1;  

if(1>>32 == 0)  

cout<<"小端模式"cout<<" 大端模式"<

上述方法正確嗎?要理解為什麼不正確?

因為不要在數值上做文章,而大小端是嚴格與記憶體掛鉤的東西。如果int a=1; 那麼a&1==1一定成立,因為這是從數值角度運算的,已經給使用者遮蔽掉了大小端的問題。一定要int a=1; *((char*)(&a)) == 1 ,這樣判斷才有效。

下面總結一些有效的方法。

方法1:利用union型別 —— 可以利用union型別資料的特點:所有成員的起始位址一致。

#include 

int checksystem()  

c;  

c.i=1;  

return (c.ch==1);  

}  int main()    

方法2:對int強制型別轉換

#include

#include

int main()    

方法3:使用union和巨集定義

#include

#include

static union  

endian = };  

#define endian ((char)endian.ul)  

int main()    

補充: 

大小端模式對union型別資料的影響。

#include 

union  

*p, u;  

int main()    

分析如下圖所示:

高位址        低位址

—— —— —— ——   int

0   |   0   |  56  |  57    

—— —— —— ——

—— ——   char

56  |   57

—— ——      

這裡需要考慮儲存模式:大端模式和小端模式。

大端模式(big-endian):資料的低位元組存放在高位址中。

小端模式(little-endian):資料的低位元組存放在低位址中。

union型資料所佔的空間等於其最大的成員所佔的空間,對union型成員的訪問都是相對於該聯合體基位址的偏移量為0處開始,即,聯合體的訪問不論對哪個變數的訪問都是從union的首位址位置開始。因此,上面程式輸出的結果就顯而易見了。

判斷系統大小端方法分析與總結

2011 03 09 wcdj 問題 如何用程式確認當前系統的儲存模式 大端還是小端 寫乙個c函式,若處理器是big endian的,則返回0 若是little endian的,則返回1。情況1 利用陣列型別 情況2 利用位移運算 上述方法正確嗎?要理解為什麼不正確?因為不要在數值上做文章,而大小端...

js陣列去重方法分析與總結

陣列去重經常被人拿來說事,雖然在工作中不常用,但他能夠很好的考察js基礎知識掌握的深度和廣度,下面從js的不同階段總結一下去重的方法。該階段主要通過迴圈遍歷陣列從而達到去重的目的 以下所有方法預設都那拿該陣列進行測試 var array 1,1 1 1 null null undefined und...

js陣列去重方法分析與總結

陣列去重經常被人拿來說事,雖然在工作中不常用,但他能夠很好的考察js基礎知識掌握的深度和廣度,下面從js的不同階段總結一下去重的方法。該階段主要通過迴圈遍歷陣列從而達到去重的目的 以下所有方法預設都那拿該陣列進行測試 var array 1,1,1 1 null,null,undefined,und...