大端小端儲存的含義及判斷

2021-07-12 00:07:45 字數 1568 閱讀 8532

大端模式

所謂的大端模式(big-endian),是指資料的高位元組,儲存在記憶體的低位址中,而資料的低位元組,儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;

例子:0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000

0000440: b484 6c4e 004e ed00 0000 0000 0100 0000

在大端模式下,前32位應該這樣讀: e6 84 6c 4e ( 假設int佔4個位元組)

記憶方法: 位址的增長順序與值的增長順序相同

小端模式

所謂的小端模式(little-endian),是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中,這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低,和我們的邏輯方法一致。

例子:0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000

0000440: b484 6c4e 004e ed00 0000 0000 0100 0000

在小端模式下,前32位應該這樣讀: 4e 6c 84 e6( 假設int佔4個位元組)

記憶方法: 位址的增長順序與值的增長順序相反

大小端模式

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

大小端儲存模式判斷(利用聯合)

「聯合」是一種特殊的類,也是一種構造型別的資料結構。在乙個「聯合」內可以定義多種不同的資料型別, 乙個被說明為該「聯合」型別的變數中,允許裝入該「聯合」所定義的任何一種資料,這些資料共享同一段記憶體,以達到節省空間的目的。

union un

;

在這個union中,un的記憶體空間的長度為4,是int型的長度。若把int改為double,則foo的記憶體空間為8。

int main()

; union un x;

x.j = 0x1234;

printf("0x%x\n", x.j);

printf("0x%x", x.i);

getchar();

return 0;

}

un的記憶體空間的長度為4,i的值為第乙個位元組儲存的內容,如果i的值為0x34則為大端儲存,否則為小端儲存。

判斷大端小端

大端模式 big endian 和小端模式 little endian 在我們傳送資料的時候,我們首先要確定是大端還是小端模式來進行的,在接收方接收的資料必須知道資料是大端還是小端模式,才能正確地讀取和儲存資料起來,否則就會出錯。有些時候cpu公司用大端 c51微控制器 有些cpu用小端 arm 我...

大端小端判斷

聯合體是共享記憶體,在聯合體重定義乙個char型別,乙個int型別,給int資料賦值為1,根據char的值是否為1就可以判斷大小端了 若char型別為1,則為小端 若char型別不為1,則為大端 判斷大小端 static bool islocalhostbigendian void num num....

大端小端的判斷

大端位元組序 big endian 是一種將資料高有效位存放在低記憶體位址的方式,而資料低有效位存放在高記憶體位址。如圖是大端機多位元組位元組序 如果是帶位域的話,比如乙個佔一位元組的結構體 struct s struct s s 對於大端機,s的兩個位域成員x1和x2都位於記憶體a所對應的乙個位元...