1. 程式人生 > >計算機為什麽要搞出“補碼”這種東西?

計算機為什麽要搞出“補碼”這種東西?

其余 實現 問題 計算機 圖片 應該 分享 溢出 strong

計算機為什麽要搞出“補碼”這種東西?

本文闡述兩個問題

①計算機為什麽要搞出個“補碼”?不嫌麻煩?

②為什麽-128的補碼是10000000?


計算機為什麽要搞出個“補碼”?

先回顧一下補碼是什麽:
|--正數的補碼是其本身(二進制原碼)
|--負數的補碼是在原碼的基礎上,符號位不變,其余位取反後加1。
為什麽好好的“原碼”不用,非搞個“補碼”出來?順帶還遷出個“反碼”……

技術分享圖片

究其原因,主要是因為計算機只會做加法,使用補碼可以把減法轉為加法計算。
關於計算機不會做加法,我們要表示理解,畢竟是那種國家發明的……

技術分享圖片

其實你也未必會做減法呀……

技術分享圖片

好了,言歸正傳,回到計算機的世界。
舉個簡單的例子:1-1=0
|--如果讓計算機計算這個簡單的算術,它只能轉成加法:(1)+(-1),

|--如果按二進制直接算(即按原碼算,左一是符號位)

  • 二進制( 1): 0000 0001
  • 二進制(-1): 1000 0001

  • 按位加等於:1000 0010

換為十進制是(-2),謬矣!

如果用補碼算:

(1)是正數,的補碼還是0000 0001

(-1)先求反碼,符號位不變,其余位取反:1000 0001→1111 1110

末位加1,得1111 1111

於是有以下兩數相加:

  • 0000 0001
  • 1111 1111

得到:[1]0000 0000

左側進位的1舍棄,該數就是0,計算正確。

所以,補碼的作用就是:把減法轉成加法進行計算


為什麽-128的補碼是10000000?

二進制1000 0000表示的有符號數是-128,這個也很奇怪:

荒謬①:-128按規則求補碼應該是[1] 1000 0000,已經溢出,未溢出的左一為符號位,其他位數取反得1111 1111,末位加1,得0000 0000,這是0的原碼!

荒謬②:按補碼的性質,1000 0000符號位為1,是負數;逆推原碼先推反碼,需末位-1,成了0000 0001,符號位為0,成正數了,自相矛盾,不用繼續。

所以1000 0000無法按照補碼規則推斷源碼,

它是-128的補碼是一個“規定”。

從另外一個角度講,補碼的存在,實現了有符號數和無符號數的一種對應關系,下圖的也形象的說明了把1000 0000定為-128的補碼合情合理。

技術分享圖片

計算機為什麽要搞出“補碼”這種東西?