一、大端模式和小端模式的起源
關於大端小端名詞的由來,有乙個有趣的故事,來自於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
32bit寬的數0x12345678在little-endian模式以及big-endian模式)cpu記憶體中的存放方式(假設從位址0x4000開始存放)為:
記憶體位址 小端模式存放內容 大端模式存放內容
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:
big-endian: 低位址存放高位,如下:
高位址---------------
buf[3] (0x78) – 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) – 高位
---------------
低位址little-endian: 低位址存放低位,如下:
高位址---------------
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處理器還可以由硬體來選擇是大端模式還是小端模式。
計算機資料的儲存方式 大端方式和小端方式
關於大端和小端,容易混淆,現在只記小端 小端,是數的高位存在記憶體位址的高位,小高高!端模式 endian 的這個詞出自jonathan swift書寫的 格列佛遊記 這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為big endian,從尖頭開始將雞蛋敲開的人被歸為...
組合語言定址方式
組合語言的定址方式 彙編有7種定址方式 mov 是組合語言用得最多的語句 他的使用方法 是 mov 目的位址,源位址 下面便通過mov來介紹組合語言的幾種定址方式 1.立即定址 mov ax,1234h 2.暫存器定址 mov si,ax 源運算元和目的運算元 同時為暫存器 3.直接定址 mov a...
組合語言之定址方式
1 固定定址 inherent addressing 特定的單運算元指令,運算元隱含在操作碼中,在固定定址的指令中,運算元被隱含在指令中,不需要執行匯流排週期,執行速度快 例子 1.1 cbw命令,將al中的符號位擴充套件到ah中,形成16位的運算元。比如al中的符號位是1,則執行cbw命令後,ah...