儲存器 大端模式與小端模式

2021-06-25 19:37:52 字數 2262 閱讀 4150

開頭講個有關大端小端的故事:

端模式(endian)的這個詞出自jonathan swift書寫的《格列佛遊記》。這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為big endian,從尖頭開始將雞蛋敲開的人被歸為littile endian。小人國的內戰就源於吃雞蛋時是究竟從大頭(big-endian)敲開還是從小頭(little-endian)敲開。在計算機業big endian和little endian也幾乎引起一場戰爭。  

我們知道在記憶體中資料是以位元組為單位進行儲存的,每個位址單元對應著乙個位元組(byte),乙個位元組為8位(bite)。但是很多時候資料除了8bit額char外,還有16bit的short,32位的long型(要看具體的編譯器),必然存在多位元組安排的問題。不同的計算機存放多位元組值的順序不同,有些機器在起始位址存放低位位元組(低位先存),即小端模式;有的機器在起始位址存放高位位元組(高位先存),即大端模式。基於intel的cpu,採用的是低位先存。而keil c51則為大端模式。大端小端對應著資料在儲存器中的存放順序。

同時,在網路傳輸中,網路協議需要指定網路位元組順序,tcp/ip協議中使用16位整數和32位整數的高位先存模式,對應我們的大端模式。

下面是兩個具體例子:

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

記憶體位址

小端模式存放內容

大端模式存放內容

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

聯合體union的存放順序是所有成員都從低位址開始存放,利用該特性可以輕鬆地獲得了cpu對記憶體採用little-endian還是big-endian模式讀寫。

寫程式判斷處理器是little-endian模式,還是big-endian模式,可以通過以下程式:

1>.通過將int強制型別轉換成char單位元組,通過判斷起始儲存位置。

void

main(

intargc, 

char

**argv) 2

注釋:如果小端方式中(i佔至少兩個位元組的長度)則i所分配的記憶體最小位址那個位元組中就存著1,其他位元組是0.大端的話則1在i的最高位址位元組處存放,char是乙個位元組,所以強制將char型量p指向i則p指向的一定是i的最低位址,那麼就可以判斷p中的值是不是1(或者為0,也即是假)來確定是不是小端。

或者如下程式:

void

main()

else}

2>.利用聯合體union的存放順序是所有成員都從低位址開始存放,判斷處理器模式。

bool

checkcpu( )

c; c.a =1

; return

(c.b ==1

);} }

以及如下程式:

bool

islittleendian()

bytes;

}dword;

dword.all

=0x87654321

;return

(0x21

==dword.bytes.byte0); }

分析:如果你的處理器呼叫函式islittleendian返回1,那麼說明你的處理器為little endian,否則為big endian.注意,如果在little endian處理器上,byte0和pad按記憶體從低到高的存放順序:low->byte0 pad[0] pad[1] pad[2] ->high;0x87654321按記憶體從低到高的存放順序:  0x21  0x43   0x65   0x87, 可見byte0對應到0x21。所以通過判斷dword中第乙個位元組dword.bytes.byte0是否與0x21相等就可以看出是否是little endian。

ps:對於聯合體union不是很清楚的可以看

這篇博文寫的很詳細。通過本文對大端小端模式有了乙個比較深的理解吧。也希望對讀者有些許幫助,謝謝!

大端小端儲存模式

端模式 endian 的這個詞出自jonathan swift書寫的 格列佛遊記 這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為big endian,從尖頭開始將雞蛋敲開的人被歸為littile endian 這句話最為形象 小人國的內戰就源於吃雞蛋時是究竟從大頭 ...

大端與小端儲存模式詳解

端模式 endian 的這個詞出自jonathan swift書寫的 格列佛遊記 這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為big endian,從尖頭開始將雞蛋敲開的人被歸為littile endian 這句話最為形象 小人國的內戰就源於吃雞蛋時是究竟從大頭 ...

大端與小端儲存模式詳解

端模式 endian 的這個詞出自jonathan swift書寫的 格列佛遊記 這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為big endian,從尖頭開始將雞蛋敲開的人被歸為littile endian 這句話最為形象 小人國的內戰就源於吃雞蛋時是究竟從大頭 ...