定義:
計算機中數據存儲的一種模式。首先由Danny Cohen(1980)引入計算機科學界。
起源:
“......我下面要告訴你的是,Lilliput和Blefuscu這兩大強國在過去的三十六個月里一直在苦戰。戰爭開始時由於一下原因:我們大家都認為,吃雞蛋前,原始的方法是打破雞蛋交大的一端,可是當今皇帝的祖父小時候吃雞蛋,一次按古法打雞蛋時碰巧將一個手指弄破了,因此他的父親,當時的皇帝,就下了一道赦令,命令全體臣民吃雞蛋是打破雞蛋較小的一端,違令者重罰。老百姓們對這項命令極為反感。歷史告訴我們,由此曾發生過六次叛亂,其中一個皇帝送了命,另一個丟了王位。這些判斷大多都是由Blefuscu的王國大臣們煽動起來的。叛亂平息後,流亡的人總是逃到那個帝國區尋求避難。據統計,先後幾次有一萬一千人情願受死也不肯去打破雞蛋較小的一端。關於這一爭端,曾出版過幾百本大部著作,不過大端派的書一直是受禁的,法律也規定該派的任何人不得做官。"(摘自蔣劍鋒譯的《格利佛遊記》第一卷第4章)Swift是在諷刺英國(Lilliput)和法國(Blefuscu)之間的持續的衝突。Danny Cohen,一位網路協定的早期開創者,第一次使用這兩個術語來指代位元組順序。”
分類:
計算機界存在著大尾端與小尾端兩在陣營,兩者存在著極深的鴻溝。
大尾端與小尾端區別
1.定義大尾端:高位在低地址。
小尾端:尾位在低地址。
如整數0x12345678在記憶體中應該如下存放:
地低: base | base+1 | base+2 | base+3 |
------------------------------------------------ |
大端 | 12 | 34 | 56 | 78 |
----------------------------------------------- |
小端 | 78 | 56 | 34 | 12 |
程式驗證:
int _tmain(int argc, _TCHAR* argv[])
{
union UData {
unsigned long integer;
unsigned char array[4];
} Data;
Data.integer=0x12345678;
printf("%x\t%x\t%x\t%x\n",Data.array[0],Data.array[1], Data.array[2], Data.array[3]);
return 0;
}
ps:一般PC是小端存儲的。
在位元組內依然是:
大端:高位放在低地址。
小端:低位放在低地址。
即大端與小端位序完全是鏡像的。下面的程式可證明。
int _tmain(int argc, _TCHAR* argv[])
{
struct BitData {
unsigned Bit0_3:4;
unsigned Bit4_7:4;
unsigned Bit8_11:4;
unsigned Bit12_15:4;
};
union SData {
unsigned short Data;
struct BitData BData;
} ssData;
ssData.Data=0x1234;//此時BData與Data完全共享同一空間。
printf("%x\t%x\t%x\t%x\n",ssData.BData.Bit0_3,ssData.BData.Bit4_7,ssData.BData.Bit8_11,ssData.BData.Bit12_15);
return 0;
}
在運行程式前請先推理一下會輸出什麼,然後運行一下看看結果。
上述程式在普通PC上(小尾端)結果應該是:
4 3 2 1
。