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