计算机中减法的实现原理
這本來就是大一的時候就開始學習的,但是之后一直沒再接觸。一接觸但有概念而沒有一個清晰的過程,所以再次縷清了后記錄一下博客。本文重點闡明了計算機中減法運算的實現以及反碼、補碼的意義。
對于加法來說,計算機很容易實現,
舉例:8 + 6 = 14;
在計算機中,也就是
0000 1000
0000 0110
.------------------------
0000 1110
0000 1110表示的則就是14. 沒毛病
那么減法呢?
舉例: 8 - 6 = 2;
在計算機怎么實現?
首先int型在當前的計算機中大多數是占了32位,這里我們為了簡便,就當作8位來處理(注意最高位是符號位,也就是8位的數據表示范圍是:-128~127)
在計算機的邏輯運算單元中,只有加法運算器,用來對兩個數進行相加,并沒有減法器的電路。因為對于減法運算,計算機也是用加法器來實現的,比如8 - 6,也可以表示成 8 +(-6),這樣就變成了加法運算,問題變成了怎么讓計算機表示出負數,有的朋友可能想:6是0000 0110,變成負數后不就是1000 0110了么,這的確沒錯。但是這樣的表示并不能被加法器所支持,加法器是不知道負數的,盡管我們把最高一位定義成了符號位。
8的二進制是 0000 1000
-6的二進制是1000 0110
0000 1000
1000 0110
.--------------
1000 1110
而1000 1110表示的是-14,這顯然不是我們要的結果。
那么換一個思路,我們知道,現在我們舉例的是8位數,最高的表示是127.
舉個時鐘的例子。數字時鐘上最大值是24點,這里的24點就是模。當到24點的時候,被取模后成為了0點。而減去1點和加上23點的效果都是一樣的,無非就是補數和取模。24+23了后取模也是23,都是表示23點。
所以8 - 6就跟 8 + (128 - 6)是一樣的。(這里的128是模)
于是乎,減法是可以被當作加法來運算的。
所以計算機便有了反碼的概念。正數的反碼是自身,負數的反碼則是除了符號位之后其他都取反(就相當于自己去加上摸之后取模后的結果)。
但是反碼后有一個問題,就是關于“0”的表示,那就是1000 0000和0000 0000都表示0,分別表示 +0 和 -0,而數學意義上并沒有正負之分。所以必須消除其中一個
于是有了補碼的概念。正數的補碼還是原碼,負數的補碼是原碼在得到反碼后再+1,
讓0只有在0000 0000的時候才表示0。
而1000 0000表示 -128,(注意,-128是通過反碼后的-0再加1得到的,-128是沒有反碼的。PS:正因如此,所以上文才說8位的數據表示范圍是:-128~127,而不是從-127開始)
于是乎 上面的 8 - 6 = 8+(-6)的問題
8的原碼、反碼、補碼都是原碼:0000 1000
而-6的原碼是 1000 0110
反碼則是除符號位外,其余位取反:1111 1001
補碼則是反碼+1,即: 1111 1010
于是兩個補碼相加:
0000 1000
1111 1010
.---------------------
0000 0010
0000 0010則是2, 正是 8 - 6的結果。
到這里已經說明了減法的實現,其實也就是利用反碼和補碼的機制,以轉換成加法運算。
而這還沒完呢,我們再來看一個例子:
6 - 8 = -2
這還不簡單? 6 - 8就等于6 + (-8)嘛,于是:
6的原碼、反碼、補碼都是原碼:0000 0110
而-8的原碼是 1000 1000
反碼則是除符號位外,其余位取反:1111 0111
補碼則是反碼+1,即: 1111 1000
于是兩個補碼相加:
0000 0110
1111 1000
.---------------------
1111 1110
天哪,1111 1110的十進制數是-126啊,6 - 8怎么可能等于-126呢。
顯然,我們這個減法當作加法來運算貌似不是特別靠譜。只要當被減數的絕對值小于減數的絕對值的時候,計算出來的結果總是不對。
當然了 不對是正常的,因為我們是用補碼來計算,計算的結果也不是原碼。這里因為符號位也參與了計算,所以最高一位并不是表示符號位了,1111 1110則是254了。想想?254 - 256 = -2,剛好是6 - 8的結果。這絕對不是偶然。
我們把1111 1110求一次補碼,先取得其反碼是: 1000 0001
則其補碼則是:1000 0010
天吶,1000 0010則就是-2,太神奇了。
所以計算機的減法運算中,運算的結果是需要再求一次補碼的
在前一個例子8 - 6的2,是因為2是正數,反碼、補碼與原碼都一樣
最后總結一下:
概念:
原碼:帶符號位的,我們表示的數值
反碼:正數的反碼是原碼,負數的反碼是除了符號位之外其余位取反
補碼:正數的補碼是原碼,負數的補碼是反碼+1
減法運算:
通過反碼的方式來將減法轉換成加法運算,通過補碼的方式消除了+0和-0的歧義。而在減法的運算結果中,還需要對結果進行補碼。
作者:lc_miao的博客
來源:CSDN
原文:https://blog.csdn.net/lc_miao/article/details/84929497
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
總結
以上是生活随笔為你收集整理的计算机中减法的实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈数据结构和数据类型
- 下一篇: linux基础——linux进程间通信(