訂閱
糾錯
加入自媒體

CPU 中的加法器,為什么可以連同符號位一起運算?

3. 十六進制加法

第 0 位:E + C,結(jié)果為 26,但是十六進制中沒有 26 這個數(shù)字,因此需要向左側(cè)的高位進 1,于是第 0 位就剩下 26 - 16 = A。

第 1 位:A + 1 等于 B,再加上進位 1,結(jié)果就是 C,十六機制中有這個數(shù)字。

四、把負數(shù)計算轉(zhuǎn)換成正數(shù)計算

 1. 原碼

原碼(true form)是一種計算機中對數(shù)字的二進制定點表示方法。原碼表示法在數(shù)值前面增加了一位符號位(即最高位為符號位):正數(shù)該位為0,負數(shù)該位為1(0有兩種表示:+0和-0),其余位表示數(shù)值的大小。

例如,用 8 個 bit (8 位二進制數(shù))來表示一個數(shù),+11 的原碼為 0000_1011,-11 的原碼就是 1000_1011。

2. 把負數(shù)計算變成正數(shù)計算

我們都知道,CPU 中有加法器,好像從來沒有聽說過“減法器”。例如計算 5 + 8,轉(zhuǎn)換成二進制來計算:

再來計算一下減法:5 - 8,對于 CPU 來說,只會計算 5 + 8, 但是不會計算 5 - 8。

但是可以轉(zhuǎn)換一下思路,把減法變成加法 5 + (-8),這樣不就可以計算了嗎?于是計算機先驅(qū)者就發(fā)明了反碼:

正數(shù)的反碼:保持原碼不變;

負數(shù)的反碼:原碼中符號位不變,其余全部取反(-8 的原碼是 1000_1000,反碼就是:1111_0111);

于是 5 + (-8)的計算過程就是:

此時,就完美解決了減法問題,那么乘法(多加幾次)、除法(多減幾次)問題也就跟著解決了。至于如何從數(shù)學的角度來證明,那就要問那些數(shù)學家了!

3. 新問題:如何表示0?

我們現(xiàn)在可以小結(jié)一下反碼的表示范圍(記住:第一位是符號位):

正數(shù)的表示范圍:0000_0000 ~ 0111_1111,也就是十進制的 +0 ~ +127 這 128 個數(shù);

負數(shù)的表示范圍:1000_0000 ~ 1111_1111,也就是十進制的 -127 ~ -0 這 128 個數(shù);

有沒有發(fā)現(xiàn)問題:怎么存在 +0 和 -0 這兩個數(shù)?而且他們的編碼還不一樣:+0 對應(yīng) 0000_0000,-0 對應(yīng) 1111_1111。

CPU 雖然就是一個傻瓜,讓它干啥就干啥,但是 CPU 最不能容忍的就是不確定性!我們都知道 +0 == -0 == 0,它們是同一個數(shù)字,但是在二進制編碼中,居然有兩個編碼來表示同一個數(shù)。

偉大的計算機先驅(qū)者又做了這樣一個決定:正數(shù)保持不變,負數(shù)整體減 1。

也就是說:符號位不變,值整體加1,如下:

這樣就成功解決了 -0、+0 的問題!

現(xiàn)在 一個 8 位的二進制就可以表示的范圍是:-128 ~ 127,并且中間沒有任何重復、遺漏的數(shù)字。

既然每一個二進制表示的值發(fā)生了變化,那么繼續(xù)稱之為反碼就不準確了,此時給它們一個新的稱呼:補碼,也就是說:上圖就變成了這樣:

小結(jié)一下補碼的定義:

正數(shù)的補碼:保持原碼不變;

負數(shù)的補碼:原碼中符號位不變,其余先全部取反,然后再加1(例如:-8 的原碼是 1000_1000,補碼就是 1111_1000);

此時,我們僅僅是解決了二級制編碼的表示問題,那么:補碼能直接參與運算嗎?運算結(jié)果會出現(xiàn)什么問題?

<上一頁  1  2  3  4  下一頁>  余下全文
聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

    掃碼關(guān)注公眾號
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯
    x
    *文字標題:
    *糾錯內(nèi)容:
    聯(lián)系郵箱:
    *驗 證 碼:

    粵公網(wǎng)安備 44030502002758號