計算系統基礎(二)

計算系統基礎(二)

如果將《計算系統基礎》書中的知識點進行粗略劃分,可以將其分爲c語言和底層部分。c語言的基礎語法可以通過網上各類視頻進行學習與鞏固,在本文中將不再贅述。因此,我們將重點放在對底層的探究和理解。接下來,我們將介紹計算機最基礎的“拼音”語法:二進制。

一、爲什麼要使用二進制?

在前文中,我們解釋爲:1和0可以準確表示計算機的電路狀態。但如果要準確描述其原因的話,不僅僅是因爲電路的表達問題。更重要的,是對計算機的表達形式和存儲方式進行統一化管理。我們用表示信息存儲的最小單元,每個位上只可能是1或0,把許多位組在一起,就可以配合表示不同信息,如8位組合在一起,就可以表示256(2^8)種不同的數,如果人爲加以規定,我們就可以用這256種情況表示256個不同的信息。下面從最基礎,大學之前已經接觸過的二進制整數開始。

二、整數的二進制

1.無符號型二進制數

暫時不考慮正負符號,一位只能存在0或1,那麼從2開始的數就應該表示爲:10,11,100,101……如果統一規範爲8位,30即是00011110,可以自行推導。

2.加上符號以後……

在實際的運算之中大量需要用到負數,那麼負數應該如何表示,首先想出的第一種方法,是將開頭的一位作爲符號表示位,比如0100表示4,那麼我們使用1100表示-4。我們將這種表示方式稱爲原碼。除原碼以外,還有人想到,我們可以把原來正數的二進制序列全部反轉(或稱按位取反),即使用1011表示-4,這種方式被稱爲反碼

然而以上兩種方法有一個致命缺陷,適用於人腦而不適用電腦,我們在進行運算的時候,可以在腦中將原碼反碼的負數翻譯,再次進行運算,但這一過程對計算機卻極其困難。

因此我們需要找出一種存儲方式,它必須能滿足:1、易於被人腦理解 2、易於計算機的計算

人們終究找出了完美適配這兩種需求的二進制表示方式,我們稱之爲補碼

補碼的正數表達方式與其他類似,如5表示爲0101

但-5表示爲1011。類似的,-10表示爲10110,-16表示爲10000……我們不難發現,補碼的負數有一個很大的特點就是它們與原先的正數相加,可以得到0。這將極其有利於計算機對數據的計算。

而對於我們來說,補碼的表現形式似乎不好理解。但是前人已經爲我們總結出規律:按位取反再加一即可得到相反數。藉助這一規律,人腦的邏輯也可以輕易理解補碼。因此,補碼成爲了當今計算機通用的數據形式。

三、小數的二進制

計算機中,我們將“小數”類型的數據,稱之爲浮點數類型。爲了方便存儲,我們採用類似於科學計數法的存儲機制。舉例來說,十進制的5.0,寫成二進制是101.0,相當於1.01*2^2.。延續着這個思路,IEEE(國際電氣和電子工程師協會)規定:

計算系統基礎(二)

我們以c語言中float型單精度浮點數爲例,對於32位的浮點數,最高的一位是s,表示0正1負,接着的8位指數爲E,剩下的23位爲有效數字M。

S只有一位,很好理解。但對於M與E來說,有着特殊的規定:

舉例來說,M表示的是1.01011*2^9的小數部分,IEEE 754規定,在計算機內部保存M時,默認第一位總是1,只保存後面的01011部分。這樣做可以節省一位有效數字,使只有23位的M可以存儲24位的信息。

至於E的情況,比較特殊。

E不僅是無符號整數,更有着特殊的規則。E共有8位,因爲無符號,取值範圍爲0~255。但爲了取到科學計數法中的負數,IEEE又規定了一箇中間數:127,E的值必須減去127才能表示數據原本類型。對1.01011*2^9,必須保存成9+127=136,即10001010。

然而還有特殊情況:E全爲1或全爲0。在E全爲0時,將E視爲真實值並且M省略的最開頭數設爲0,這樣做可以表示一些極其靠近0的小數,如0.000000001

在E全爲1時,這時如果有效數字M全爲0,表示正/負無窮大。

四、二進制與十六進制

由於二進制表示繁瑣且不易理解,我們一般使用十六進制簡化表達二進制。每四位二進制對等於一個十六進制數:這是因爲四位二進制可以表示0~15,恰好對應十六進制中的0~F,在將十六進制表示爲二進制後,再去考慮補碼或浮點數等情況。

五、其他

在二進制的章節中,除了上述內容以外,《計算系統基礎》一書中還詳細提出了二進制和十進制,十進制到二進制及十六進制的轉換方式,還有較爲重要卻易於理解的布爾代數運算,本文只根據書中重難點進行羅列,希望給各位對二進制的理解帶來一定的幫助和思考。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章