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

2021-05-24 12:12:47 字數 970 閱讀 4385

2011-03-09 wcdj

問題:如何用程式確認當前系統的儲存模式(大端還是小端)?寫乙個c函式,若處理器是big-endian的,則返回0;若是little-endian的,則返回1。

情況1:利用陣列型別

情況2:利用位移運算

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

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

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

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

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

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

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

分析如下圖所示:

高位址        低位址

—— —— —— ——   int

0   |   0   |  56  |  57   

—— —— —— ——

—— ——   char

56  |   57

—— ——     

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

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

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

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

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

情況1 利用陣列型別 include int checksystem int main 情況2 利用位移運算 int i 1 if 1 32 0 cout 小端模式 cout 大端模式 上述方法正確嗎?要理解為什麼不正確?因為不要在數值上做文章,而大小端是嚴格與記憶體掛鉤的東西。如果int a 1 ...

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...