2011-03-09 wcdj 問題:如何用程序確認(rèn)當(dāng)前系統(tǒng)的存儲模式(大端還是小端)?寫一個C函數(shù),若處理器是Big-endian的,則返回0;若是Little-endian的,則返回1。
情況1:利用數(shù)組類型 情況2:利用位移運(yùn)算 上述方法正確嗎?要理解為什么不正確? 因為不要在數(shù)值上做文章,而大小端是嚴(yán)格與內(nèi)存掛鉤的東西。如果int a=1; 那么a&1==1一定成立,因為這是從數(shù)值角度運(yùn)算的,已經(jīng)給用戶屏蔽掉了大小端的問題。一定要int a=1; *((char*)(&a)) == 1 ,這樣判斷才有效。
下面總結(jié)一些有效的方法。
方法1:利用union類型 —— 可以利用union類型數(shù)據(jù)的特點(diǎn):所有成員的起始地址一致。 方法2:對int強(qiáng)制類型轉(zhuǎn)換 方法3:使用union和宏定義 補(bǔ)充: 大小端模式對union類型數(shù)據(jù)的影響。 分析如下圖所示: 高地址 低地址 —— —— —— —— int 0 | 0 | 56 | 57 —— —— —— —— —— —— char 56 | 57 —— —— 這里需要考慮存儲模式:大端模式和小端模式。 大端模式(Big-endian):數(shù)據(jù)的低字節(jié)存放在高地址中。 小端模式(Little-endian):數(shù)據(jù)的低字節(jié)存放在低地址中。 union型數(shù)據(jù)所占的空間等于其最大的成員所占的空間,對union型成員的存取都是相對于該聯(lián)合體基地址的偏移量為0處開始,即,聯(lián)合體的訪問不論對哪個變量的存取都是從union的首地址位置開始。因此,上面程序輸出的結(jié)果就顯而易見了。
|