端模式(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,返回true;
//反之為 little-endian,返回false
bool
isbig_endian()
//isbig_endian()
方法二:
int
checkcpuendian()
//返回1,為小端;反之,為大端;
c; c.a =1;
return
1== c.b;
}
#if defined(big_endian) && !defined(little_endian)
#define htons(a) (a)
#define htonl(a) (a)
#define ntohs(a) (a)
#define ntohl(a) (a)
#elif defined(little_endian) && !defined(big_endian)
#define htons(a) ((((uint16_t)(a) & 0xff00) >> 8 ) | \\((
(uint16_t
)(a)
&0x00ff
)<<8)
)#define htonl(a) ((((uint32_t)(a) & 0xff000000) >> 24) | \\((
(uint32_t
)(a)
&0x00ff0000
)>>8)
| \\
(((uint32_t
)(a)
&0x0000ff00
)<<8)
| \\
(((uint32_t
)(a)
&0x000000ff
)<<24)
)#define ntohs htons
#define ntohl htohl
#else
#error either big_endian or little_endian must be #defined, but not both.
#endif
大端與小端儲存模式詳解
端模式 endian 的這個詞出自jonathan swift書寫的 格列佛遊記 這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為big endian,從尖頭開始將雞蛋敲開的人被歸為littile endian 這句話最為形象 小人國的內戰就源於吃雞蛋時是究竟從大頭 ...
大端與小端儲存模式詳解
端模式 endian 的這個詞出自jonathan swift書寫的 格列佛遊記 這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為big endian,從尖頭開始將雞蛋敲開的人被歸為littile endian 這句話最為形象 小人國的內戰就源於吃雞蛋時是究竟從大頭 ...
大端與小端儲存模式詳解
分類 c c 學習交流 2009 08 13 10 51 3241人閱讀收藏 舉報 儲存byte ibm 端模式 endian 的這個詞出自jonathan swift書寫的 格列佛遊記 這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為big endian,從尖頭開始...