一:CPU運算器中,只有加法器
CPU運算器里面,只有加法器,加法器電路相對于減法器來說要簡單很多,成本就少很多,受硬件資源限制,主要是為了精簡硬件.
從數(shù)學角度塘淑,減法是可以轉(zhuǎn)換成加法運算的洲愤。乘法同樣可以轉(zhuǎn)換成加法運算玄窝,除法可以轉(zhuǎn)換成乘法運算奕塑,所以一切的運算都可以以加法運算為基礎牵舵,所以CPU只會做加法也沒有問題柒啤。
二:如何將減法轉(zhuǎn)換成加法運算
1.糾正一個誤區(qū)
舉個例子 ,3減2 和 3加(-2)
比如我要做減法,3減2,將減法轉(zhuǎn)換成加法,很容易想到,3加(-2),這不是將減法轉(zhuǎn)換成加法運算,細想一下,我們在做3加(-2)的時候,還是將3加(-2)轉(zhuǎn)化成了3減2來計算,所以3加(-2)本質(zhì)還是在做減法.
2.那么如何將減法轉(zhuǎn)換成加法運算呢?
將減法轉(zhuǎn)換成加法運算首先了解模的概念:
“模”是指一個計量系統(tǒng)的計數(shù)范圍.
時鐘的計量范圍是12,模=12
當前時鐘,指向3點, 要想調(diào)整時鐘到1點,有兩種方法:
(1)倒撥2小時,即 3-2 = 1 點
(2)順撥10小時, 即 3+10 = 12(溢出) + 1 = 1 點
在以12模的系統(tǒng)中,減2和加10,效果都一樣,因此凡是減2的運算,都可以用加10來替代,我們稱 -2和 10互為補數(shù)
一個負數(shù)可用它的正補數(shù)來代替畸颅,而這個正補數(shù)可以用模加上負數(shù)本身來得到担巩。
所以將減法運算(加負數(shù)),轉(zhuǎn)換成加法運算,是加負數(shù)的補數(shù).
正數(shù)的補數(shù)為其自身,(加正數(shù),是在做加法,不需要轉(zhuǎn)換.)
計算機只有加法器,將減法轉(zhuǎn)成加法運算的道理與此相同
三.十進制VS二進制
在計算機中,由邏輯電路組成,邏輯電路通常只有兩個狀態(tài)没炒,開關(guān)的接通與斷開涛癌,這兩種狀態(tài)正好可用“1”和“0”表示,所以計算機使用二進制進行運算.所以在理解計算機將減法轉(zhuǎn)換成加法運算之前,還要了解一下二進制.
十進制: 逢十進一,只有0-9共十個符號,個位數(shù)最大為9,需要表示十這個數(shù)量時,就要從個位跳到高位的地方記1,同時個位補上0
0,1,2,3,4,5,6,7,8,9,10(十)
二進制: 逢二進一,只有0,1兩個符號,個位數(shù)最大為1,需要表示二這個數(shù)量的時候,就要從各位調(diào)到高位的地方記1,同時個位補上0
0,1,10(二),11(三)
從圖中可以看到,一個8位二進制數(shù),普通正常編碼,可以表示的數(shù)為 -127~127,其中還有0和-0
而在計算機中1個字節(jié)(8位)表示的范圍是-128到127,根本沒有0和-0的概念,那么-0哪里去了? -128又是哪里來的,1個8位的二進制數(shù)根本無法表示-128,最小的數(shù)是-127,而計算機中1個字節(jié)確可以取值-128.
顯然計算機雖然使用的是二進制運算,但并不是采用普通正常二進制進行編碼.
四:計算機減法轉(zhuǎn)加法運算:
計算機將減法轉(zhuǎn)成加法運算,和時鐘加補數(shù)的道理一樣,就是加負數(shù)的補碼的形式.
如圖詳述:
如圖所示得出結(jié)論:
補碼解決的問題:
1.減法運算轉(zhuǎn)換成加法運算(通過負數(shù)轉(zhuǎn)成補碼再做加法運算,正數(shù)的補碼是本身,整數(shù)就是做加法,不需要轉(zhuǎn)換)
2.符號位參與運算(負數(shù)的補碼是負數(shù))
3.0和-0的問題(下面介紹)
所以求補碼的方法:
1:正數(shù):與原碼相同。
2:負數(shù):求負的補碼送火,求負整數(shù)的補碼拳话,將其原碼除符號位外的所有位取反后加1,符號位為1不變
擴展:-128的補碼是誰?
8位二進制數(shù)沒法表示-128,所以沒法算-128的補碼?
求補碼的方法是根據(jù)模的概念推到出來的,本質(zhì)還是減法轉(zhuǎn)加法的模的理念,
回溯一下模的概念.
模為12的鐘表, 減2 和 加10 一樣, 減3 和 加9一樣, 那么減12呢? 和加0一樣.所以-12的補數(shù)是0
同理:
補碼解決了符號位參與運算的問題,補碼都是負數(shù).
8位二進制數(shù),模為128
-1 的 補碼 -127
-2 的補碼 -126
-127的補碼 -1
-128的補碼 -0
五:0和-0
如果計算機采用普通正常二進制進行編碼,然后在運算的時候,轉(zhuǎn)換成補碼運算,原碼就會0和-0
0的補碼是0,而-0的補碼是-128, 在一個8位的二進制數(shù),-128無法表示,最小數(shù)是-127,然而做減法的運算,是將負數(shù)轉(zhuǎn)成補碼,加補碼的形式運算,是補碼在參與運算.而不是原碼 , -0的補碼是負128, -128沒辦法表示,沒辦法參與運算,那么-0就沒有意義了,就浪費了.
計算機參減法操作,實際是通過加補碼的形式
如果直接采用補碼對數(shù)字進行編碼,那么所有的減法運算,就是加補碼的運算了,運算時就無需轉(zhuǎn)成補碼了.