大端模式和小端模式

2021-09-23 16:58:11 字數 2017 閱讀 5207

一、為什麼會有大小端模式之分

這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為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處理器還可以由硬體來選擇是大端模式還是小端模式。

二、什麼是大端和小端

舉乙個例子,比如數字0x12 34 56 78在記憶體中的表示形式。

1)大端模式:big-endian就是高位位元組排放在記憶體的低位址端,低位位元組排放在記憶體的高位址端。

(其實大端模式才是我們直觀上認為的模式,和字串儲存的模式差類似)

低位址 --------------------> 高位址

0x12 | 0x34 | 0x56 | 0x78

2)小端模式:little-endian就是低位位元組排放在記憶體的低位址端,高位位元組排放在記憶體的高位址端。

低位址 --------------------> 高位址

0x78 | 0x56 | 0x34 | 0x12

3)下面是兩個具體例子:

16bit寬的數0x1234在little-endian模式(以及big-endian模式)cpu記憶體中的存放方式(假設從位址0x4000開始存放)為:

32bit寬的數0x12345678在little-endian模式以及big-endian模式)cpu記憶體中的存放方式(假設從位址0x4000開始存放)為:

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) – 低位

--------------

低位址四、如何判斷機器的位元組序

bool isbigendian()  

return false;

}

bool isbigendian()  

num;

num.a = 0x1234;

if( num.b == 0x12 )

return false;

}

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

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

大端模式和小端模式

大端模式和小端模式 在c語言中除了8位的char型之外,還有16 位的short型,32 位的long型 要看具體的編譯器 對於位數大於8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於乙個位元組,那麼必然 存在著如何將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。大端模...

大端模式和小端模式

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