linux bigendian未定义,big endian与little endian
很多人都知道big endian和little endian但是很少有人知道它們的實(shí)質(zhì),因?yàn)橹灰阍诰W(wǎng)上一google,出來的都是那個(gè)經(jīng)典的典故,不可否認(rèn),那個(gè)典故很重要,但是那也僅僅是個(gè)故事而已,計(jì)算機(jī)也僅僅是利用了這個(gè)故事的名字罷了,說到它們的實(shí)質(zhì)還要看存儲式體系計(jì)算機(jī)剛開始的時(shí)候,那個(gè)時(shí)候人們紛紛將數(shù)據(jù)和指令存入內(nèi)存,如今我們很坦然的說出一個(gè)字節(jié)八位,一個(gè)int型的數(shù)據(jù)32位,可是那個(gè)時(shí)候人們在設(shè)計(jì)這一切的時(shí)候卻沒有這么坦然,他們甚至都不把八位想的這么特殊,現(xiàn)在想想為什么一個(gè)字節(jié)是八位,為什么八位顯得那么重要,其實(shí)這里并沒有什么必然的東西,因?yàn)橛?jì)算機(jī)是以二進(jìn)制為基礎(chǔ)的,八位一字節(jié)在硬件上最簡單,最高效,當(dāng)時(shí)的cpu的數(shù)據(jù)總線最多也就有8位,而且8位最大可以表示255,正好表示完所有的拉丁字符,可是隨著軟件硬件的進(jìn)步,而且實(shí)際上我們必須表示一個(gè)大于255的數(shù)字而不是字符,那么八位的數(shù)據(jù)量太小了,因此必須用超過一個(gè)字節(jié)的內(nèi)存存儲更大的數(shù)據(jù)類型,這就涉及到如何安排這些多字節(jié)數(shù)據(jù)的字節(jié)順序了,因?yàn)檫壿嬌想m然一個(gè)int就是一個(gè)整數(shù),但是人們根本不會管它在物理上怎么被載入內(nèi)存,應(yīng)該是怎么簡單怎么高效就怎么安排,就好像邏輯上一個(gè)進(jìn)程有四個(gè)G的虛存空間,但是物理上怎么安排實(shí)際分給這個(gè)進(jìn)程的內(nèi)存就是操作系統(tǒng)的事情了,邏輯上連續(xù)物理上不一定連續(xù)在字節(jié)續(xù)上也有所體現(xiàn),于是怎么安排多字節(jié)的數(shù)據(jù)就是個(gè)問題,像虛擬內(nèi)存那樣徹底分開然后建立一套映射機(jī)制顯得沒有必要,那么就有了big endian和little endian這樣的排列方式,以字節(jié)為一個(gè)單位,然后安排這些字節(jié)的位置,不至于太分散但又不失靈活,這就是策略,于是big endian和little endian其實(shí)是根據(jù)不同的側(cè)重點(diǎn)而最終采用的兩種方式罷了,其實(shí)現(xiàn)在的計(jì)算機(jī)已經(jīng)都是32位的了,8位的基本字節(jié)要改變了,但是即使改了也還要面對字節(jié)序的問題,畢竟數(shù)據(jù)類型的大小沒有上限,對于big endian來說,自然數(shù)據(jù)的高位在內(nèi)存的低位,按照cpu發(fā)出的訪問指令據(jù)總線導(dǎo)致內(nèi)存訪問的順序是從低地址到高地址的,也就是先訪問到最高的數(shù)據(jù)位,按照二進(jìn)制數(shù)據(jù)的編碼,最高位是符號位,也就是說big endian的機(jī)器最先訪問到符號位,這對于運(yùn)算來說是很有優(yōu)勢的,現(xiàn)在看看little endian的情況,正好和big endian相反,數(shù)據(jù)總線最先訪問到自然數(shù)據(jù)的最低位,但是想要的到符號不得不先看看數(shù)據(jù)占幾個(gè)字節(jié)找到最高位,然后才能判定,很麻煩,但是先訪問低位也有好處,比如位訪問比較有效,cpu訪問一個(gè)數(shù)據(jù)的第n位就需要簡單的從該數(shù)的開始處移動(dòng)n/8個(gè)位置即可,僅僅一個(gè)移位,很簡單,這個(gè)特性可以很方便的進(jìn)行類型轉(zhuǎn)換,軟件上類型轉(zhuǎn)換比較頻繁的用little endian比較有效,而不怎么需要類型轉(zhuǎn)換的,數(shù)據(jù)類型比較固定的就用big endian比較好。
現(xiàn)在我們看一個(gè)重要的發(fā)現(xiàn),就是CISC/RISC與big/little endian的關(guān)系,我們知道RISC擁有大量的寄存器,所有的計(jì)算都在寄存器進(jìn)行,只有在load或者store的時(shí)候才訪問內(nèi)存,而這兩個(gè)操作僅僅是加載或者存儲一個(gè)數(shù)字,數(shù)字的符號以及大小等信息越容易得到越好,現(xiàn)在看看CISC,由于類型轉(zhuǎn)換涉及到計(jì)算,涉及到一些cpu指令,比如將一個(gè)32位的寄存器放到一個(gè)16位的臨時(shí)數(shù)據(jù)中,而32位數(shù)據(jù)的得到涉及到很多尋址方式,很可能數(shù)據(jù)就是從內(nèi)存得到的,因此CISC中為了最快的類型轉(zhuǎn)換需要最快的位訪問,這就是說,對于CISC的cpu,用little endian比較好,而對于RISC的cpu,用big endian比較好。
計(jì)算機(jī)中的很多事情都沒有絕對的為什么,很多都是因?yàn)闅v史原因,在當(dāng)時(shí)的歷史條件下必須那樣,也許也不是必須那樣,而是因?yàn)槟菢痈唵?#xff0c;然后就確定了一些規(guī)則,計(jì)算機(jī)不僅僅是一門科學(xué),它還是一個(gè)工業(yè),工業(yè)就要兼顧經(jīng)濟(jì)利益,于是向下兼容就很重要了,其實(shí)很多概念都是為了兼容而遺留下來的,于是很多人就將它們當(dāng)成教條,這很不應(yīng)該。
總結(jié)
以上是生活随笔為你收集整理的linux bigendian未定义,big endian与little endian的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux系统做成iso镜像文件,如何在
- 下一篇: 顶级操盘手是怎样准确把握入场时机的