以下計算基於字節單位,由於負數是以補碼存儲,所以一下負數表示形式皆為補碼
1.負數的二進制求法
負數的二進制一般通過正數反推導出,即(正數二進制 -> 取反 -> 補碼(加1)),舉個例子:
99的二進制為:0110 0011
那么-99的二進制計算方法為
0110 0011 1.取反: 1001 1100 即0轉為1,1轉為0 2.補碼: 1001 1101 即低位加1 那么,1001 1101即為十進制的 -99
有同學要問了,如果低位為1該如何加1?這就是二進制的基礎算法了,即逢二進一,舉個例子:
98的二進制為:0110 0010 取反:1001 1101 補碼:1001 1110 這里1+1等於2了,所以不是相加,而是進一位
那如果是1001 1111,結果就是1010 0000,這里有個規律,即從右向左找到第一個0,然后這個0后的數字全部變為0,而此0加1變為1
2.由負數二進制推正數
其實與正數退負一樣,主要就是取反和補碼,不過這里有一點概念上的點需要注意,即很多人通過負數進制反推正數時,習慣的按正數推負數的步驟反着來,
即:
-99: 1001 1101 1.低位-1: 1001 1100 2.取反: 0110 0011
這么做的結果固然是正確的,但計算機是不做減法的,計算機的減法其實是加法,即1+(-1),所以我們理解起來正常的邏輯在計算機計算中並不適用
那么按正常的算法,步驟應該為:
-99: 1001 1101 1.取反: 0110 0010 2.補碼: 0110 0011
同樣的先取反后補碼。
這么說可能不太好理解,有網友舉出這樣一個公式,這樣就容易理解了:
正數 + 負數 = 0
正碼 + 反碼 + 1 = 0
所以,正碼取反+1即為反碼,反碼取反+1即為正碼
3.那么,如果正數與負數相加,該如何計算呢
上面我們可以看到,正數99的二進制為0110 0011,正數的原碼、反碼、補碼都是一樣的,所以99的補碼也是0110 0011,
然后-98的補碼為1001 1110,那么,兩個進制相加結果:
0110 0011 + 1001 1110 = 1 0000 0001
高位溢出,則舍棄高位,所以結果為:0000 0001,即為10進制的1
至於二進制的加法運算方法,如下:
1.將數字對齊
2.從右向左,上下上下兩個數字相加
3.如果不是1+1,即1+0、0+1、0+0,那就直接相加,如果兩個數都是1,則1+1=10,結果列寫上0,1向上進,這里規則跟普通十進制計算一樣,比如13+8,3+8=11,結果列寫上1,然后十位數的1向上進,然后1+1 = 2,結果即為21。
4.如果超出位數,則從坐向右舍棄溢出的數字
如果覺得文字表述不清楚,百度經驗上有直觀的的圖片解釋:https://jingyan.baidu.com/article/86112f135745432736978776.html