電腦儲存的大小端模式解析

來源:互聯網
上載者:User

標籤:blog   http   ar   color   os   使用   strong   on   資料   

文章參考地址:http://www.cnblogs.com/kubixuesheng/p/4107060.html

http://blog.csdn.net/hackbuteer1/article/details/7722667

原作者文章連結,寫得很好,沒必要再重新分析了,看這個就夠了。一般在《電腦群組成原理》,或者《微機原理》,或者《組合語言》等課程中也會有介紹,不過沒有這麼詳細透徹罷了。紅色筆記是我的註解。

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

先主要介紹了大小端問題的來源,作者應該是基於32位的機器來講解的。

在各種電腦體繫結構中,對於位元組、字等的儲存機制有所不同,因而引發了電腦 通訊領 域中一個很重要的問題,即通訊雙方交流的資訊單元(位元、位元組、字、雙字等等)應該以什麼樣的順序進行傳送。如果不達成一致的規則,通訊雙方將無法進行正 確的編/解碼從而導致通訊失敗。目前在各種體系的電腦中通常採用的位元組儲存機制主要有兩種:Big-Endian和Little-Endian,下面先從位元組序說起。

一、什麼是位元組序

位元組序,顧名思義位元組的順序,再多說兩句就是大於一個位元組類型的資料在記憶體中的存放順序(一個位元組的資料當然就無需談順序的問題了)。其實大部分人在實際的開發中都很少會直接和位元組序打交道。唯有在跨平台以及網路程式中位元組序才是一個應該被考慮的問題。
在所有的介紹位元組序的文章中都會提到位元組序分為兩類:Big-Endian和Little-Endian,引用標準的Big-Endian和Little-Endian的定義如下:
a) Little-Endian就是低位位元組排放在記憶體的低地址端,高位位元組排放在記憶體的高地址端。
b) Big-Endian就是高位位元組排放在記憶體的低地址端,低位位元組排放在記憶體的高地址端。(兩個明白一個就ok,大小端是相反的)
c) 網路位元組序:TCP/IP各層協議將位元組序定義為Big-Endian,因此TCP/IP協議中使用的位元組序通常稱之為網路位元組序。
1.1 什麼是高/低地址端

首先我們要知道C程式映像中記憶體的空間布局情況:在《C專 家編程》中或者《Unix環境進階編程》中有關於記憶體空間布局情況的說明,大致如:

----------------------- 最高記憶體位址 0xffffffff(32位2進位數,都是1的情況,16進位就是0xffffffff)
棧底

棧頂
-----------------------(和我們通常意義上的畫圖是相反的,棧在記憶體裡是向下增長,且發現記憶體自上而下,地址是由高到低變換,俗稱的高地址到低地址變化)
NULL (空洞)
-----------------------

-----------------------
未初始化的資料
----------------------- 統稱資料區段
初始化的資料
-----------------------
本文段(程式碼片段)
----------------------- 最低記憶體位址 0x00000000

由圖可以看出記憶體分布中,棧是向下增長的,而堆是向上增長的。以為例如果我們在棧上分配一個unsigned char buf[4],那麼這個陣列變數在棧上是如何布局的呢?看:

棧底 (高地址)
----------
buf[3]
buf[2]
buf[1]
buf[0]

----------
棧頂 (低地址)

其實,我們可以自己在編譯器裡面建立一個數組,然後分別輸出數組種每個元素的地址,來驗證一下。

1.2 什麼是高/低位元組

現在我們弄清了高/低地址,接著考慮高/低位元組。有些文章中稱低位位元組為最低有效位,高位位元組為最高有效位。如果我們有一個32位無符號整型0x12345678,那麼高位是什麼,低位又是什麼呢? 其實很簡單。在十進位中我們都說靠左邊的是高位,靠右邊的是低位,在其他進位也是如此。就拿 0x12345678來說,從高位到低位的位元組依次是0x12、0x34、0x56和0x78。

高/低地址端和高/低位元組都弄清了。我們再來回顧 一下Big-Endian和Little-Endian的定義,並用圖示說明兩種位元組序:
以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) -- 低位
--------------
棧 頂 (低地址)
二、各種Endian
2.1 Big-Endian
電腦體繫結構中一種描述多位元組儲存順序的術語,在這種機制中最重要位元組(MSB)存放在最低端的地址 上。採用這種機制的處理器有IBM3700系列、PDP-10、Mortolora微處理器系列和絕大多數的RISC處理器。

MSB   the most significant byte

+----------+
| 0x34 |<-- 0x00000021
+----------+
| 0x12 |<-- 0x00000020
+----------+

圖 1:雙位元組數0x1234以Big-Endian的方式存在起始地址0x00000020中
在Big-Endian中,對於bit序列中的序號編排方式如下(以雙位元組數0x8B8A=(1000 1011 1000 1010)2為例):
bit 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
+-----------------------------------------+
val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
+----------------------------------------+

圖 2:Big-Endian的bit序列編碼方式

2.2 Little-Endian
電腦體繫結構中 一種描述多位元組儲存順序的術語,在這種機制中最不重要位元組(LSB)存放在最低端的地址上。採用這種機制的處理器有PDP-11、VAX、Intel系列微處理器和一些網路通訊裝置。該術語除了描述多位元組儲存順序外還常常用來描述一個位元組中各個位元的排放次序。
+----------+
| 0x12 |<-- 0x00000021
+----------+
| 0x34 |<-- 0x00000020
+----------+
圖3:雙位元組數0x1234以Little-Endian的方式存在起始地址0x00000020中

在 Little-Endian中,對於bit序列中的序號編排和Big-Endian剛好相反,其方式如下(以雙位元組數0x8B8A=(1000 1011 1000 1010)2為例):
bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+-----------------------------------------+
val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
+-----------------------------------------+
圖 4:Little-Endian的bit序列編碼方式

注意:通常我們說的主機序(Host Order)就是遵循Little-Endian規則。所以當兩台主機之間要通過TCP/IP協議進行通訊的時候就需要調用相應的函數進行主機序 (Little-Endian)和網路序(Big-Endian)的轉換。

採用 Little-endian模式的CPU對運算元的存放方式是從低位元組到高位元組,而Big-endian模式對運算元的存放方式是從高位元組到低位元組。 32bit寬的數0x12345678在Little-endian模式CPU記憶體中的存放方式(假設從地址0x4000開始存放)為:
                                          記憶體位址     0x4000     0x4001     0x4002     0x4003
                                          存放內容     0x78        0x56        0x34         0x12

而在Big- endian模式CPU記憶體中的存放方式則為:
                                          記憶體位址     0x4000     0x4001     0x4002     0x4003
                                          存放內容     0x12         0x34        0x56         0x78

具體的區別如下:

三、Big-Endian和Little-Endian優缺點
Big-Endian優點:

首先提取高位位元組,你總是可以由看看在位移位置為0的位元組來確定這個數字是正數還是負數(因為低地址存放高位元組)。你不必知道這個數值有多長,或者你也不必過一些位元組來看這個數值是否含有符號位。這個數值是以它們被列印出來的順序存放的,所以從二進位到十進位的函數特別有效。因而,對於不同要求的機器,在設計存取方式時就會不同。
Little-Endian優點:

提取一個,兩個,四個或者更長位元組資料的彙編指令以與其他所有格式相同的方式進行:首先在位移地址為0的地方提取最低位的位元組,因為地址位移和位元組數是一對一的關係,多重精度的數學函數就相對地容易寫了。
如果你增加數位值,你可能在左邊增加數字(高位非指數函數需要更多的數字)。 因此, 經常需要增加兩位元字並移動儲存空間裡所有Big-endian順序的數字,把所有數向右移,這會增加電腦的工作量。不過,使用Little- Endian的儲存空間中不重要的位元組可以存在它原來的位置,新的數可以存在它的右邊的高位地址裡。這就意味著電腦中的某些計算可以變得更加簡單和快速。

辛苦的勞動,轉載請註明出處,謝謝……

電腦儲存的大小端模式解析

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.