linux bigendian未定义,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比較好。
計算機中的很多事情都沒有絕對的為什么,很多都是因為歷史原因,在當時的歷史條件下必須那樣,也許也不是必須那樣,而是因為那樣更簡單,然后就確定了一些規則,計算機不僅僅是一門科學,它還是一個工業,工業就要兼顧經濟利益,于是向下兼容就很重要了,其實很多概念都是為了兼容而遺留下來的,于是很多人就將它們當成教條,這很不應該。
總結
以上是生活随笔為你收集整理的linux bigendian未定义,big endian与little endian的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux系统做成iso镜像文件,如何在
- 下一篇: 顶级操盘手是怎样准确把握入场时机的