基礎知識了解:
在計算機內,整數的長度是確定的,在字長為32位的計算機中,整數的長度就是32個二進制,這其中還包括了符號位(1表示正,0表示負)。這里面我們為了方便描述,就假設機器字長為8位。
例如,十進制整數23,二進制真值表示為10111,其原碼表示為 0001 0111。
十進制整數-23,二進制真值表示為-10111,原碼表示為 1001 0111。
簡而言之,源碼就是最高位為符號位,其他位表示該數的絕對值
如果計算機內部采用原碼表示數,那么在進行加法和減法運算的時候,最終都轉化為兩個絕對值的加運算和減運算,因此,在設計計算器的時候就既需要設計加法運算器,又要設計減法運算器(代價有點大,是否可以就用一種類型的運算器呢? 其實大多數人都喜歡做加法運算,不太喜歡用減法運算)。
補碼的思想
我們希望只設計加法運算器,不用減法運算器,我們希望找到一種方案,采用這種方案做加運算 1 + ( -1 ) ,兩個數可以直接根據二進制的加法規則做運算,得到0,而不必做減法。
補碼就是最方便的方式。它的便利體現在,所有的加法運算可以使用同一種電路完成。
以-8作為例子。假定有兩種表示方法。一種是直覺表示法,即10001000;另一種是2的補碼表示法,即11111000。請問哪一種表示法在加法運算中更方便?
隨便寫一個計算式,16 + (-8) = ?
16的二進制表示是 00010000,所以用直覺表示法,加法就要寫成:
+10001000
---------
10011000
現在,再來看2的補碼表示法。
+11111000
---------
100001000
補碼的本質:
要將正數轉成對應的負數,其實只要用0減去這個數就可以了。比如,-8其實就是0-8。
已知8的二進制是00001000,-8就可以用下面的式子求出:
00000000
- 00001000
---------
因為00000000(被減數)小於0000100(減數),所以不夠減。請回憶一下小學算術,如果被減數的某一位小於減數,我們怎么辦?很簡單,問上一位借1就可以了。
所以,0000000也問上一位借了1,也就是說,被減數其實是100000000,算式也就改寫成:
100000000
-00001000
---------
11111000
進一步觀察,可以發現100000000 = 11111111 + 1,所以上面的式子可以拆成兩個:
11111111
-00001000
---------
11110111
+00000001
---------
11111000
補碼的兩個轉換步驟就是這么來的。(其中的 1111 1000 就是-8的補碼,是由對 000 1000 取反得到111 0111 加1 最終得到 111 1000,最后加上符號位1就是1111 1000)。這就是補碼計算規則的由來。