1. 程式人生 > >位元組序——大端(Big Endian)和小端(Little Endian)

位元組序——大端(Big Endian)和小端(Little Endian)

每次碰到這個問題都需要現查資料,腦子不夠用啊,索性就把它的來龍去脈寫下來,加深一下印象。

1. 位元組序問題的存在原因

自計算機採用byte作為儲存單位起,位元組序就是一個有爭議的話題。這是因為我們通常處理的資料都是多位元組資料,比如c語言中一個型別為int的變數,在記憶體中需要佔用四個位元組的地址空間(0x400, 0x401, 0x402, 0x403),那麼如何將這個變數的值放在這四個位元組中,就是位元組序的問題。

針對這個問題,目前主要有兩種規則,也就是資料按照大端序存放和小端序存放。在介紹這兩種方式之前,先介紹一下,為什麼把它們命名為大端和小端吧。

2. 名字的來歷

“endian”一詞來源於喬納森·斯威夫特的小說格列佛遊記。小說中,小人國為水煮蛋該從大的一端(Big-End)剝開還是小的一端(Little-End)剝開而爭論,爭論的雙方分別被稱為“大端派”和“小端派”。以下是1726年關於大小端之爭歷史的描述:

“我下面要告訴你的是,Lilliput和Blefuscu這兩大強國在過去36個月裡一直在苦戰。戰爭開始是由於以下的原因:我們大家都認為,吃雞蛋前,原始的方法是打破雞蛋較大的一端,可是當今皇帝的祖父小時候吃雞蛋,一次按古法打雞蛋時碰巧將一個手指弄破了。因此他的父親,當時的皇帝,就下了一道敕令,命令全體臣民吃雞蛋時打破雞蛋較小的一端,違令者重罰。老百姓們對這項命令極其反感。歷史告訴我們,由此曾經發生過6次叛亂,其中一個皇帝送了命,另一個丟了王位。這些叛亂大多都是由Blefuscu的國王大臣們煽動起來的。叛亂平息後,流亡的人總是逃到那個帝國去尋求避難。據估計,先後幾次有11000人情願受死也不肯去打破雞蛋較小的一端。關於這一爭端,曾出版過幾百本大部著作,不過大端派的書一直是受禁的,法律也規定該派任何人不得做官。”

1980年,Danny Cohen,一位網路協議的早期開發者,在其著名的論文"On Holy Wars and a Plea for Peace"中,為平息一場關於位元組該以什麼樣的順序傳送的爭論,而第一次引用了該詞。

3. 大小端解釋

大端:一個多位元組整數,數字的高位部分存放在記憶體的低地址單元。

小端:一個多位元組整數,數字的低位部分存放在記憶體的低地址單元。

舉個例子,如果有一個4位元組的整數0x0A0B0C0D。

如果按照大端方式儲存它在記憶體中的位置即為:


如果按照小端方式儲存它在記憶體中的位置即為:


實際上,人們在哪種位元組序更高效這個問題上,表現的就像吃雞蛋的問題一樣,沒有技術上的原因。對於單一位元組,大部分處理器以相同的順序處理位元,因此存放方式和傳輸方式一致。但對於多位元組,不同的處理器有不同的方式。

4. 大小端的應用

目前x86處理器以及大部分ARM處理器均使用的是小端方式,而SPARC、Motorola、PowerPC、IBM等使用的是大端方式。

通常,網路傳輸中使用的是大端方式。所以只要你的系統中需要處理網路過來的資料,你就需要考慮大小端的問題了。