標籤(空格分隔): 物件導向技術與c++
參考:有部分刪減
關於大端小端名詞的由來,有乙個有趣的故事,來自於jonathan swift的《格利佛遊記》:lilliput和blefuscu這兩個強國在過去的36個月中一直在苦戰。戰爭的原因:大家都知道,吃雞蛋的時候,原始的方法是打破雞蛋較大的一端,可以那時的皇帝的祖父由於小時侯吃雞蛋,按這種方法把手指弄破了,因此他的父親,就下令,命令所有的子民吃雞蛋的時候,必須先打破雞蛋較小的一端,違令者重罰。然後老百姓對此法令極為反感,期間發生了多次叛亂,其中乙個皇帝因此送命,另乙個丟了王位,產生叛亂的原因就是另乙個國家blefuscu的國王大臣煽動起來的,叛亂平息後,就逃到這個帝國避難。據估計,先後幾次有11000餘人情願死也不肯去打破雞蛋較小的端吃雞蛋。這個其實諷刺當時英國和法國之間持續的衝突。danny cohen一位網路協議的開創者,第一次使用這兩個術語指代位元組順序,後來就被大家廣泛接受。
big-endian和little-endian的定義如下:
little-endian就是低位位元組排放在記憶體的低位址端,高位位元組排放在記憶體的高位址端。
big-endian就是高位位元組排放在記憶體的低位址端,低位位元組排放在記憶體的高位址端。
舉乙個例子,比如數字0x12 34 56 78在記憶體中的表示形式為:
1)大端模式:
低位址 —————–> 高位址
0x12 | 0x34 | 0x56 | 0x78
2)小端模式:
低位址 ——————> 高位址
0x78 | 0x56 | 0x34 | 0x12
可見,大端模式和字串的儲存模式類似。
3)下面是兩個具體例子:
記憶體位址
小端模式存放內容
大端模式存放內容
0x4000
0x34
0x12
0x4001
0x12
0x34
記憶體位址
小端模式存放內容
大端模式存放內容
0x4000
0x78
0x12
0x4001
0x56
0x34
0x4002
0x34
0x56
0x4003
0x12
0x78
4)大端小端沒有誰優誰劣,各自優勢便是對方劣勢:
小端模式 :強制轉換資料不需要調整位元組內容,1、2、4位元組的儲存方式一樣。
大端模式 :符號位的判定固定為第乙個位元組,容易判斷正負。
以unsigned int value = 0x12345678為例,分別看看在兩種位元組序下其儲存情況,我們可以用unsigned char buf[4]來表示value:
高位址
—————
buf[3] (0x78) – 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) – 高位
—————
低位址高位址
—————
buf[3] (0x12) – 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) – 低位
————–
低位址這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如果將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。
例如乙個16bit的short型x,在記憶體中的位址為0x0010,x的值為0x1122,那麼0x11為高位元組,0x22為低位元組。對於大端模式,就將0x11放在低位址中,即0x0010中,0x22放在高位址中,即0x0011中。小端模式,剛好相反。
我們常用的x86結構是小端模式,而keil c51則為大端模式。很多的arm,dsp都為小端模式。有些arm處理器還可以由硬體來選擇是大端模式還是小端模式。
可以編寫乙個小的測試程式來判斷機器的位元組序:
bool isbigendian()
return false;
}
bool isbigendian()
num;
num.a = 0x1234;
if( num.b == 0x12 )
return false;
}
一般作業系統都是小端,而通訊協議是大端的。
big endian : powerpc、ibm、sun
little endian : x86、dec
arm既可以工作在大端模式,也可以工作在小端模式。
adobe ps – big endian
bmp – little endian
dxf(autocad) – variable
gif – little endian
jpeg – big endian
macpaint – big endian
rtf – little endian
對於字資料(16位):
#define bigtolittle16(a) (( ((uint16)(a) & 0xff00) >> 8) | \
(( (uint16)(a) & 0x00ff) << 8))
對於雙字資料(32位):
#define bigtolittle32(a) ((( (uint32)(a) & 0xff000000) >> 24) | \ (( (uint32)(a) & 0x00ff0000) >> 8) | \
(( (uint32)(a) & 0x0000ff00) << 8) | \
(( (uint32)(a) & 0x000000ff) << 24))
詳解大端模式和小端模式
一 大端模式和小端模式的起源 關於大端小端名詞的由來,有乙個有趣的故事,來自於jonathanswift的 格利佛遊記 lilliput和blefuscu這兩個強國在過去的36個月中一直在苦戰。戰爭的原因 大家都知道,吃雞蛋的時候,原始的方法是打破雞蛋較大的一端,可以那時的皇帝的祖父由於小時侯吃雞蛋...
詳解大端模式和小端模式
一,什麼是大端和小端 big endian和little endian的定義如下 1 little endian就是低位位元組排列在記憶體的低位址端,高位位元組排放在記憶體的高位址端 2 big endian就是高位位元組排放在記憶體的低位址端,低位位元組排放在記憶體的高位址端 舉乙個簡單的例子,比...
小端模式和大端模式 大端模式和小端模式
0x123456在記憶體中的儲存方式 大端模式 低位址 小端模式 低位址 不難看出大端模式比較符合人的直觀認識 1.一開始是由於不同架構的cpu處理多個位元組資料的順序不一樣,比如x86的是小段模式,keil c51是大端模式。但是後來網際網路流行,tcp ip協議規定為大端模式,為了跨平台通訊,還...