學(xué)習(xí)過計算機(jī)組成原理的同學(xué)可能知道,雖然我們可以讓計算機(jī)做減法運算,但是計算機(jī)內(nèi)部實際上是在做加法運算。因為加、減、乘、除四則運算都可以分解成加法運算和位移運算,而且計算機(jī)也只會處理這兩種簡單的運算,所以計算機(jī)內(nèi)部會通過一個叫作加法器的電子元件來處理減法運算。
將減法運算轉(zhuǎn)換為加法運算就要用到負(fù)數(shù),但是計算機(jī)只認(rèn)識二進(jìn)制數(shù)字,并不認(rèn)識符號“-”。為了表示負(fù)數(shù),人們就規(guī)定二進(jìn)制數(shù)的最高位為符號位,符號位是 0 時表示證書,符號位是 1 時表示負(fù)數(shù)。
舉個例子,1 如果用 8 位二進(jìn)制數(shù)來表示的應(yīng)該是 00000001,最高位也就是左邊第一位是 0。那么很同學(xué)肯定會覺得 -1 的二進(jìn)制數(shù)應(yīng)該是 10000001,這樣表示會有什么問題呢?我們都知道 1 +(-1) = 0, 但是 00000001 + 10000001 = 10000001,而忽略符號位后,10000001 的表示的十進(jìn)制數(shù)是 1,這顯然是不對的,正確答案其實是 11111110。很多同學(xué)肯定會有疑問,11111111 去掉符號位后表示的十進(jìn)制數(shù)不是 126 嗎?1 的負(fù)數(shù)怎么可能是126 呢?先別急,我們把 11111111 稱作 00000001 的補(bǔ)數(shù)。
補(bǔ)數(shù)又稱為補(bǔ)碼,是為了在計算機(jī)中表示負(fù)數(shù)而定義的概念。將一個二進(jìn)制數(shù)的各個位上的數(shù)值取反然后再將結(jié)果加 1,就可以得到這個二進(jìn)制數(shù)的補(bǔ)數(shù)。然后我們來看一下 1 + (-1) 的二進(jìn)制計算過程: 00000001 + 11111111 = 100000000,得到的是一個 9 位的二進(jìn)制數(shù),比原來的 8 位多出了 1 位,由于硬件物理上的限制計算機(jī)會忽略掉最高位的溢出。因此在計算機(jī)看來相加的結(jié)果是 00000000,這也就滿足了 1 + (-1) = 0。同理,對一個二進(jìn)制負(fù)數(shù)求補(bǔ)數(shù),就可以得到相應(yīng)的正數(shù)。