問題引入
:一個8位補碼:1000 0000 請求它的原碼?
如果按照以往的取反加一經驗:取反得到 1111 1111B ,再加1得到 0000 0000B ?結果是0?
這明顯不對,因爲我們知道不管是正0還是負0,其補碼都應該是 0000 0000B而不是題中的1000 0000B。
探究:
讓我們來思考一個問題:一個8位有符號二進制數,除掉符號位其表示範圍爲 0~128,如果加上符號位,照理說應該乘2,也就是256個碼字可以用來表示,但是我們知道8位有符號數的表示範圍是-127-127,也就是說一共255個數,可以發現少了一個數,這是因爲負數0沒有意義。我們可以猜想到:原碼有255個,如果通過取反加一得到的補碼也就會少一個,而這個數就是1000 0000,其無法通過取反加一得到(因爲如果只有0無法借位)。所以爲什麼會有補碼的存在,就是用來彌補原碼負0的不足。
結論歸納:
原碼求補碼:正數不變,對於負數我們仍然可以取反加一
補碼求原碼:對於1開頭後全0的數,其真值就是負0浪費的值,也就是-128(0到127,所以-1應該到128),這個補碼是沒法通過取反加一求原碼的,因爲其沒有原碼。但對於其他補碼我們仍然可以取反加1求原碼。