CPU的大端模式(big endian)和小端(little endian)模式——Union的妙用
作為一個計算機相關專業的人,我們應該在計算機組成中都學習過什么叫Little endian 和Big endian。Little endian 和Big endian 是CPU 存放數據的兩種不同順序。對于整型、長整型等數據類型,Big endian 認為第一個字節是最高位字節(按照從低地址到高地址的順序存放數據的高位字節到低位字節);而Little endian 則相反,它認為第一個字節是最低位字節(按照從低地址到高地址的順序存放數據的低位字節到高位字節)。

例如,假設從內存地址0x0000 開始有以下數據:
0x12 0x34 0xab 0xcd
如 果我們去讀取一個地址為0x0000 的四個字節變量,若字節序為big-endian,則讀出結果為0x1234abcd;若字節序位little-endian,則讀出結果為 0xcdab3412。如果我們將0x1234abcd 寫入到以0x0000 開始的內存中,則Little endian 和Big endian 模式的存放結果如下:
地址?????????????? 0x0000 0x0001 0x0002 0x0003
big-endian???????? 0x12?? 0x34?? 0xab?? 0xcd
little-endian????? 0xcd?? 0xab 0x34?? 0x12
一般來說,x86 系列CPU 都是little-endian 的字節序,PowerPC 通常是Big endian,還有的CPU 能通過跳線來設置CPU 工作于Little endian 還是Big endian 模式。
顯然,解答這個問題的方法只能是將一個字節(CHAR/BYTE 類型)的數據和一個整型數據存放于同樣的內存
開始地址,通過讀取整型數據,分析CHAR/BYTE 數據在整型數據的高位還是低位來判斷CPU 工作于Little
endian 還是Big endian 模式。得出如下的答案:
[cpp]? view plain ?copy
typedef?unsigned?char?BYTE;
int?main(int?argc,?char*?argv[])
{
unsigned?int?num,*p;
p?=?#
num?=?0;
*(BYTE?*)p?=?0xff;//指針類型強制轉換
if(num?==?0xff)
{
printf("The?endian?of?cpu?is?little\n");
}
else?//num?==?0xff000000
{
printf("The?endian?of?cpu?is?big\n");
}
return?0;
}
[cpp]? view plain ?copy
int?checkCPU()
{
{
union?w
{
int?a;
char?b;
}?c;
c.a?=?1;
return?(c.b?==?1);
}
}
[cpp]? view plain ?copy
static?union?{?char?c[4];?unsigned?long?mylong;?}?endian_test?=?{{?'l',?'?',?'?',?'b'?}?};
#define?ENDIANNESS?((char)endian_test.mylong)
(如果ENDIANNESS=’l’表示系統為little endian,為’b’表示big endian )。
延伸閱讀:http://blog.csdn.net/xiajun07061225/article/details/7295355
Linux
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。