計算機組成原理學習(三)整數比較,浮點數的表示


上篇鏈接:https://www.cnblogs.com/banmei-brandy/p/12299655.html

 

浮點數的表示可能是第一個勸退點,第一遍直接看視頻看不懂,因為移碼是在前面講的,和后面沒聯系起來,講到后面太快了一時半會理不清,看書卻一下子明白了。

 


1.基於補碼的整數比較

C語言程序中,數據后面帶上個“u”或“U”可表示數據是無符號的,用無符號去解釋數據。

下面的整數判斷表達式會出現與常識相違背的結果。(32位機器,基於補碼編碼)

 

 

第一條,左邊的0的機器數是32位的一串0,右邊的機器數也是一串0,加上U用無符號解釋一樣是0,所以結果為真。

第二條,-1的機器數是32位全部為1,0是32位0,默認帶符號比較,-1的機器數的真值為-1,所以比0小,結果為真。

第三條,0帶了U,表達式會被解釋為無符號來比較,-1機器數的真值變為2^32-1,遠比0大,結果為假

第四條,左邊的機器數為首位為0、其余為1的序列,右邊的機器數為首位為1,其余為0的序列,按帶符號比較,左邊真值為最大正數2^31-1,右邊為最小負數-2^31,所以結果為真。

第五條,帶了U用無符號比較,左邊正數不受影響,真值仍然是2^31-1,右邊真值變為2^31,所以結果為假

第六條,左邊真值一樣不受影響,右邊先是帶符號,真值解釋為2^31,又強轉成int,即帶符號,真值變成最小負數-2^31,所以結果為真

第七條,帶符號比較,左邊真值為-1,右邊真值為-2,結果為真。

第八條,左邊強轉成無符號,真值變成2^32 -1,右邊也同理變成2^32 -2,所以結果為真。

 

發現,機器數按無符號去解釋,相當於我們平時理解的字面意思,也就是不管編碼方式,真值就是二進制正常換算成十進制的值。

 

2.浮點數的編碼

實數是包括整數部分和小數部分的數,那啥叫“浮點數”?啥叫“定點數”?

此處的點指的是小數點。如果我用8位去存儲實數,假如規定了第一位存符號,后3位存整數,最后4位存小數這種編碼方式,那么很明顯小數的精度只能到后四位,小數點是固定不變的,這叫“定點數”。

有一個科學計數法表示的十進制數

6.543*10^2

6.543是實數,小數點后面的543是尾數,10是冪,4是指數(階數)。指數表示了小數點應該向右移動還是向左移動,因為是+2,所有向右移動2格,我們知道這個數字是654.3。這種小數可以移動的實數就叫“浮點數”。

浮點數實際上擴大了存儲實數的精度的范圍。

類比十進制,假如有二進制實數

1.0111 * 2^3

我們知道這個數是1011.1。

所以理論上說,我們知道尾數部分0.111,指數部分3,還有符號,就能把這個實數表示出來。

 

IEEE754規定計算機中浮點數分為三部分編碼:S(Sign符號)E(Exponent指數)M(Mantissa)

 

 

S只有一位,0表示正,1表示負。

根據上面的類比,指數部分是有正負的,正表示小數點右移,負表示小數點左移,在計算機中本來也是按有符號數存儲,但實際上E指數部分要注意,它是采用移碼(也有書上叫余碼)編碼的,移碼說白了就是在原碼的基礎上,把所有數統一加上一個偏置常數,目的是為了讓所有負數和正數都變成正的。

比如有4位可以編碼總共16個數字,只使用一個機器數表示0,那么它可表示-7到+8。

假如我們按把它們全部加上7的方式編碼,那么它們就會變成0到15,全為正。之后解碼時全部減去7即可。7就是偏置常數,也就是說偏置常數的意思就是能夠讓所有數統一為正的值,或者說與最小負數相加后為0的值。

之所以這樣做,是為了對階比較的方便。

 

 

我們學過十進制的科學計數法比較,就是把指數變成一樣的,然后看實數部分就可以了。所以干脆存儲時就讓指數統一為正。

偏置常數 = 2^(編碼位數-1) - 1

M尾數部分的第一位默認為1,是一個隱含部分,不會顯示出來。剩下部分就是尾數。

 

3.IEEE標准

IEEE754規定了浮點數單精度雙精度的存儲標准。

單精度用32位編碼浮點數。S有1位,E有8位,M有23位(首位隱含)。

雙精度用64位編碼浮點數。S有1位,E有11位,M有52位(首位隱含)。

 

4.浮點數的解碼

浮點數的機器數序列串如下,划分好S、E、M三部分后就很容易解碼,

S是符號,E要減去一個偏置常數,尾數部分就是小數點后面的值,最后整合起來就行。

 

同理,要把一個十進制實數轉換成機器數的步驟——

(1)把十進制數轉換成二進制數

(2)二進制數規格化表示(方便區分出SEM三部分)

(3)符號S決定第一位;階碼為E加上偏置常數;M就是規格化表示后的浮點數的尾數部分。

 

5.特殊數的表示

浮點數除了0,,還能把正負無窮等特殊數表示出來。

(1)階碼為全0,尾碼也為全0,可以表示為+/-0(看符號位)。

(2)階碼為全0,尾碼為全0值,可以表示非規格化的數(之前規格化都是1.xxx*2^x的數,非規格化就是0.xxx*2^x的那一部分非常小的實數)。

(3)正常情況

(4)階碼為全1,尾碼為全0,表示正無窮或者負無窮。常出現在一個浮點數除以0的情況。

(5)階碼為全1,尾碼為非0,說明這不是一個數。比如sqrt(-4)這種對負數開根號的情況。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM