大端模式小端模式

2021-07-04 21:37:40 字數 3012 閱讀 1455

「大端」和「小端」可以追溯到2023年的jonathan swift的《格列佛遊記》,其中一篇講到有兩個國家因為吃雞蛋究竟是先打破較大的一端還是先打破較小的一端而爭執不休,甚至爆發了戰爭。2023年10月,danny cohen的文章《論聖戰以及對和平的祈禱》(on holy wars and a plea for peace)將這一對詞語引入了計算機界(《程式設計實踐》第9章)。這麼看來,所謂大端和小端,也就是big-endian和little-endian,其實是從描述雞蛋的部位而引申到計算機位址的描述,也可以說,是從乙個俚語衍化來的計算機術語。在計算機裡,對於位址的描述,很少用「大」和「小」來形容;對應地,用的更多的是「高」和「低」;很不幸地,這對術語直接按字面翻譯過來就成了「大端」和「小端」,讓人產生迷惑也不是很奇怪的事了。

如果將乙個32位的整數0x12345678存放到乙個整型變數(int)中,這個整型變數採用大端或者小端模式在記憶體中的儲存由下表所示。為簡單起見,此處使用op0表示乙個32位資料的最高位元組msb(most significant byte),使用op3表示乙個32位資料最低位元組lsb(leastsignificant 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)

由上表所知,採用大小模式對資料進行存放的主要區別在於在存放的位元組順序,大端方式將高位存放在低位址,小端方式將高位存放在高位址。採用大端方式進行資料存放符合人類的正常思維,而採用小端方式進行資料存放利於計算機處理。到目前為止,採用大端或者小端進行資料存放,其孰優孰劣也沒有定論。

有的處理器系統採用了小端方式進行資料存放,如intel的奔騰。有的處理器系統採用了大端方式進行資料存放,如ibm半導體和freescale的powerpc處理器。不僅對於處理器,一些外設的設計中也存在著使用大端或者小端進行資料存放的選擇。

因此在乙個處理器系統中,有可能存在大端和小端模式同時存在的現象。這一現象為系統的軟硬體設計帶來了不小的麻煩,這要求系統設計工程師,必須深入理解大端和小端模式的差別。大端與小端模式的差別體現在乙個處理器的暫存器,指令集,系統匯流排等各個層次中。

如何判斷系統中的cpu 是little endian 還是big endian 模式?

分析:

作 為乙個計算機相關專業的人,我們應該在計算機組成中都學習過什麼叫little endian 和big endian。little endian 和big endian 是cpu 存放資料的兩種不同順序。對於整型、長整型等資料型別,big endian 認為第乙個位元組是最高位位元組(按照從低位址到高位址的順序存放資料的高位位元組到低位位元組);而little endian 則相反,它認為第乙個位元組是最低位位元組(按照從低位址到高位址的順序存放資料的低位位元組到高位位元組)。

例如,假設從記憶體位址0x0000 開始有以下資料:

0x12 0x34 0xab 0xcd

如 果我們去讀取乙個位址為0x0000 的四個位元組變數,若位元組序為big-endian,則讀出結果為0x1234abcd;若位元組序位little-endian,則讀出結果為 0xcdab3412。如果我們將0x1234abcd 寫入到以0x0000 開始的記憶體中,則little endian 和big endian 模式的存放結果如下:

位址 0x0000 0x0001 0x0002 0x0003

big-endian 0x12 0x34 0xab 0xcd

little-endian 0xcd 0xab 0x34 0x12

一般來說,x86 系列cpu 都是little-endian 的位元組序,powerpc 通常是big endian,還有的cpu 能通過跳線來設定cpu 工作於little endian 還是big endian 模式。

解答:

顯然,解答這個問題的方法只能是將乙個位元組(char/byte 型別)的資料和乙個整型資料存放於同樣的記憶體

開始位址,通過讀取整型資料,分析char/byte 資料在整型資料的高位還是低位來判斷cpu 工作於little

endian 還是big endian 模式。得出如下的答案:

typedef unsigned char byte;

int main(int argc, char* argv)

else //num == 0xff000000

return 0;

}除了上述方法(通過指標型別強制轉換並對整型資料首位元組賦值,判斷該賦值賦給了高位還是低位)外,還有沒有更好的辦法呢?我們知道,union 的成員本身就被存放在相同的記憶體空間(共享記憶體,正是union 發揮作用、做貢獻的去處),因此,我們可以將乙個char/byte 資料和乙個整型資料同時作為乙個union 的成員,得出如下答案:

int checkcpu()

c; c.a=1;

return (c.b==1); } }

實現同樣的功能,我們來看看linux 作業系統中相關的源**是怎麼做的:

static union endian_test = };

#define endianness ((char)endian_test.mylong)
linux 的核心作者們僅僅用乙個union 變數和乙個簡單的巨集定義就實現了一大段**同樣的功能!由以上一段**我們可以深刻領會到linux 源**的精妙之處!(如果endianness=』l』表示系統為little endian,

為』b』表示big endian )

小端模式和大端模式 大端模式和小端模式

0x123456在記憶體中的儲存方式 大端模式 低位址 小端模式 低位址 不難看出大端模式比較符合人的直觀認識 1.一開始是由於不同架構的cpu處理多個位元組資料的順序不一樣,比如x86的是小段模式,keil c51是大端模式。但是後來網際網路流行,tcp ip協議規定為大端模式,為了跨平台通訊,還...

大端模式 小端模式

大端模式,是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 小端模式,是指資料的低位儲存在記憶體的低位址中,而資料的高位儲存在記憶體的高位址中,這種儲存模式將...

大端模式小端模式

什麼是大端和小端 大端小端是位元組在記憶體中的儲存的順序。自己理解 方便記憶 從低位址開始到高位址,如果先存高位位元組,那麼就是大端模式,如果是先存低位位元組,就是小端模式。當然是針對至少占用兩個位元組的資料來說,如果是只占用乙個位元組,就沒有大端小端問題了。另外網路位元組順序是大端模式。大端小端各...