天天看點

big endian與little endian

很多人都知道big endian和little endian但是很少有人知道它們的實質,因為隻要你在網上一google,出來的都是那個經典的典故,不可否認,那個典故很重要,但是那也僅僅是個故事而已,計算機也僅僅是利用了這個故事的名字罷了,說到它們的實質還要看存儲式體系計算機剛開始的時候,那個時候人們紛紛将資料和指令存入記憶體,如今我們很坦然的說出一個位元組八位,一個int型的資料32位,可是那個時候人們在設計這一切的時候卻沒有這麼坦然,他們甚至都不把八位想的這麼特殊,現在想想為什麼一個位元組是八位,為什麼八位顯得那麼重要,其實這裡并沒有什麼必然的東西,因為計算機是以二進制為基礎的,八位一位元組在硬體上最簡單,最高效,當時的cpu的資料總線最多也就有8位,而且8位最大可以表示255,正好表示完所有的拉丁字元,可是随着軟體硬體的進步,而且實際上我們必須表示一個大于255的數字而不是字元,那麼八位的資料量太小了,是以必須用超過一個位元組的記憶體存儲更大的資料類型,這就涉及到如何安排這些多位元組資料的位元組順序了,因為邏輯上雖然一個int就是一個整數,但是人們根本不會管它在實體上怎麼被載入記憶體,應該是怎麼簡單怎麼高效就怎麼安排,就好像邏輯上一個程序有四個G的虛存空間,但是實體上怎麼安排實際分給這個程序的記憶體就是作業系統的事情了,邏輯上連續實體上不一定連續在位元組續上也有所展現,于是怎麼安排多位元組的資料就是個問題,像虛拟記憶體那樣徹底分開然後建立一套映射機制顯得沒有必要,那麼就有了big endian和little endian這樣的排列方式,以位元組為一個機關,然後安排這些位元組的位置,不至于太分散但又不失靈活,這就是政策,于是big endian和little endian其實是根據不同的側重點而最終采用的兩種方式罷了,其實作在的計算機已經都是32位的了,8位的基本位元組要改變了,但是即使改了也還要面對位元組序的問題,畢竟資料類型的大小沒有上限,對于big endian來說,自然資料的高位在記憶體的低位,按照cpu發出的通路指令據總線導緻記憶體通路的順序是從低位址到高位址的,也就是先通路到最高的資料位,按照二進制資料的編碼,最高位是符号位,也就是說big endian的機器最先通路到符号位,這對于運算來說是很有優勢的,現在看看little endian的情況,正好和big endian相反,資料總線最先通路到自然資料的最低位,但是想要的到符号不得不先看看資料占幾個位元組找到最高位,然後才能判定,很麻煩,但是先通路低位也有好處,比如位通路比較有效,cpu通路一個資料的第n位就需要簡單的從該數的開始處移動n/8個位置即可,僅僅一個移位,很簡單,這個特性可以很友善的進行類型轉換,軟體上類型轉換比較頻繁的用little endian比較有效,而不怎麼需要類型轉換的,資料類型比較固定的就用big endian比較好。

現在我們看一個重要的發現,就是CISC/RISC與big/little endian的關系,我們知道RISC擁有大量的寄存器,所有的計算都在寄存器進行,隻有在load或者store的時候才通路記憶體,而這兩個操作僅僅是加載或者存儲一個數字,數字的符号以及大小等資訊越容易得到越好,現在看看CISC,由于類型轉換涉及到計算,涉及到一些cpu指令,比如将一個32位的寄存器放到一個16位的臨時資料中,而32位資料的得到涉及到很多尋址方式,很可能資料就是從記憶體得到的,是以CISC中為了最快的類型轉換需要最快的位通路,這就是說,對于CISC的cpu,用little endian比較好,而對于RISC的cpu,用big endian比較好。

計算機中的很多事情都沒有絕對的為什麼,很多都是因為曆史原因,在當時的曆史條件下必須那樣,也許也不是必須那樣,而是因為那樣更簡單,然後就确定了一些規則,計算機不僅僅是一門科學,它還是一個工業,工業就要兼顧經濟利益,于是向下相容就很重要了,其實很多概念都是為了相容而遺留下來的,于是很多人就将它們當成教條,這很不應該。

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1273951