為什么計算機要使用補碼??

[toc]

概 述

開門見山,我認為有兩點最重要的原因:

  1. 補碼可以滿足 A +(-A)== 0
  2. 補碼可以讓有符號數和無符號數的計算規則一致

之前在網上查資料,查到的原因大多數都是解釋了第一點,而且解釋的有理有據令人信服。
所以我這里先說第二點,規則一致,這個是看了 深入理解計算機系統 的公開課學到的。
B站深入理解計算機系統公開課(有中文字幕,強烈推薦)

順便提一嘴,研究這種問題不要用很大的數去想,就用4位數去思考反而能想的很清楚。


補碼讓 有符號數 和 無符號數 的計算規則一致

假設我們有一個只有4位的計算機,計算乘法-2 * -3 的值。如果使用原碼或者反碼進行計算,

注意,乘法的計算規則是:直接截斷保留最低4位,保留后的最高位即為符號位。


使用補碼計算

-2 的補碼: 1110 轉換成無符號數(十進制): 14
-3 的補碼: 1101 轉換成無符號數(十進制): 13

無符號數 14 * 13 = 182

將182 轉換成 二進制 并且只保留最低 4 位: 0110 (0110的十進制是 6, 等于正確答案)

使用原碼計算

-2 的原碼: 1010 轉換成無符號數(十進制): 10
-3 的原碼: 1011 轉換成無符號數(十進制): 11

無符號數 10 * 11 = 110

將110 轉換成 二進制 并且只保留最低 4 位: 1110 (1110的十進制是 -6 或者 14,均不等于正確答案 6)


如果你覺得這是個巧合,那么可以自己試幾個數算一下,或者用反碼也算一下,看看是什么結果。

有符號數 和 無符號數 計算規則一致 有什么好處?

可以簡化硬件的計算,因為硬件就是單純的電路板,它可不知道什么符號位,它能做的就是把接收到的兩個值做運算。

如果計算機使用原碼,那么是不是cpu需要準備兩套運算電路,運算前還要做個if else 判斷?一套給有符號數用,一套給無符號數用。這樣子會造成極大的資源浪費。

但是如果我們使用補碼,就可以讓硬件無腦的計算再截斷好了,反正最后的值不論是 有符號 還是 無符號, 都能得到正確的答案


補碼可以滿足 A +(-A)== 0

由于講這個的太多了,這里就簡單說一下(不寫反碼了,直接用補碼舉例)。

用整數 1 來做個實驗,

1 的原碼是 0001,補碼是 0001。

-1的原碼是1001,補碼是 1111。

如果你讓 1 和 -1 的原碼相加,那么他們很明顯不得 0, 但是補碼相加溢出再截斷,最后等于0 。

至于為什么會這樣?因為補碼的定義就是這樣啊

用我自己的話總結:補碼就等于現有的位再加一位,新加的位等于1,其余都為0 。減去當前的原碼,就成了補碼。

用例子來說就是 10000 (總共5位) 減去 1 的原碼 0001, 就等于 1 的補碼 1111 。
10000 - 00001 = 1111


快速看出補碼的十進制小方法

用 -1 舉例 , -1 的補碼 1111
這四位不是對應著 8 4 2 1 嘛,那么直接把 最高位 的值 乘以 -1, 其他位都是正值,加起來就行了。

1 1 1 1
-8 4 2 1

-8*1 + 4*1 + 2*1 + 1*1 = -1

比如 -3, -3 的補碼 1101

1 1 0 1
-8 4 2 1

-8*1 + 4*1 + 2*0 + 1*1 = -3

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容