http://www.cnblogs.com/xinsheng/archive/2012/04/18/2455039.html
端模式(Endian)的這個詞出自Jonathan Swift書寫的《格列佛游記》。這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為Big Endian,從尖頭開始將雞蛋敲開的人被歸為Littile Endian(這句話最為形象)。小 人國的內戰就源于吃雞蛋時是究竟從大頭(Big-Endian)敲開還是從小頭(Little-Endian)敲開。在計算機業Big Endian和Little Endian也幾乎引起一場戰爭。在計算機業界,Endian表示數據在存儲器中的存放順序。下文舉例說明在計算機中大小端模式的區別。
如果將一個32位的整數0x12345678存放到一個整型變量(int) 中,這個整型變量采用大端或者小端模式在內存中的存儲由下表所示。為簡單起見,本文使用OP0表示一個32位數據的最高字節MSB(Most Significant Byte),使用OP3表示一個32位數據最低字節LSB(Least Significant Byte)。?
?
地址偏移 | 大端模式 | 小端模式 |
0x00 | 12(OP0) | 78(OP3) |
0x01 | 34(OP1) | 56(OP2) |
0x02 | 56(OP2) | 34(OP1) |
0x03 | 78(OP3) | 12(OP0) |
?
小端:較高的有效字節存放在較高的的存儲器地址,較低的有效字節存放在較低的存儲器地址。
大端:較高的有效字節存放在較低的存儲器地址,較低的有效字節存放在較高的存儲器地址。
如果將一個16位的整數0x1234存放到一個短整型變量(short)中。這個短整型變量在內存中的存儲在大小端模式由下表所示。?
?
地址偏移 | 大端模式 | 小端模式 |
0x00 | 12(OP0) | 34(OP1) |
0x01 | 34(OP1) | 12(OP0) |
?
由上表所知,采用大小模式對數據進行存放的主要區別在于在存放的字節順序,大端方式將高位存放在低地址,小端方式將高位存 放在高地址。采用大端方式進行數據存放符合人類的正常思維,而采用小端方式進行數據存放利于計算機處理。到目前為止,采用大端或者小端進行數據存放,其孰 優孰劣也沒有定論。
有的處理器系統采用了小端方式進行數據存放,如Intel的奔騰。有的處理器系統采用了大端方式進行數據存放,如IBM半導體和Freescale的PowerPC處理器。不僅對于處理器,一些外設的設計中也存在著使用大端或者小端進行數據存放的選擇。
因此在一個處理器系統中,有可能存在大端和小端模式同時存在的現象。這一現象為系統的軟硬件設計帶來了不小的麻煩,這要求系統設計工程師,必須深入理解大端和小端模式的差別。大端與小端模式的差別體現在一個處理器的寄存器,指令集,系統總線等各個層次中。
【用函數判斷系統是Big Endian還是Little Endian】
//如果字節序為big-endian,返回true;
//反之為?? little-endian,返回false
bool?IsBig_Endian()
{
????unsigned short?test =?0x1234;
??? if(*( (unsigned char*) &test ) ==?0x12)
???????return?TRUE;
?? else
???????return?FALSE;
?
}//IsBig_Endian()
?
附:
大小端的分度值是 byte,即每一個byte都是按照正常順序,但是byte組裝成一個int 或者是 long等時每個byte的擺放位置不同