計算機為什麽要搞出“補碼”這種東西?
計算機為什麽要搞出“補碼”這種東西?
本文闡述兩個問題
①計算機為什麽要搞出個“補碼”?不嫌麻煩?
②為什麽-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的補碼合情合理。
計算機為什麽要搞出“補碼”這種東西?