最近的狀態真是糟糕透了,連大端小端的問題也含含糊糊才搞出來,還是基礎不夠紮實呀!
平時不做大端小端的判斷(預設都是小端),時間長了就只彷彿記得大端小端和雞蛋有關係^:^
一、大端小端的概念(以下概念來自網路)
端模式(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) |
由上表所知,採用大小模式對資料進行存放的主要區別在於在存放的位元組順序,大端方式將高位存放在低地址,小端方式將低位存放在低地址。採用大端方式 進行資料存放符合人類的正常思維,而採用小端方式進行資料存放利於電腦處理。到目前為止,採用大端或者小端進行資料存放,其孰優孰劣也沒有定論。
二、程式判斷
#i nclude <stdio.h>
union little_big_end
{
short x16;
long y32;
};
int main(void)
{
little_big_end lbe;
printf("the size of lbe=%d\n",sizeof(lbe));
lbe.y32 = 0x12345678;
if(lbe.x16 == 0x1234 )
{
printf("the memory format is big end!\n");
}
else if(lbe.x16 == 0x5678 )
{
printf("the memory format is little end!\n");
}
getchar();
return 0;
}
當然,直接存入0x12345678,再讀取低地址資料做判斷也可以做判斷。(這裡順便複習一下共用體的用法)