補碼引入
舉一個生活化的例子
假設由一個掛鐘,它只能順時鐘調時間,那么它調時間就分成了一下兩種情況
- 正好順時針調就能調好 如:時針從5調到9
- 需要逆時針調才能調好 如:時針從10調到7
在上面的情況中1是不用處理的,2我們可以下意識的想到順時針轉過12后再轉到7.
誒,這就是計算機補碼的思想,我們再用更詳細的過程推到一下。
上面的10逆時針調到7記為 10 - 3 = 7
那么10順時針調到7就是 10 + 2 = 12 再加 7 也就是加了9
原來10 - 3 在 表盤里與 10 + 9 是相等的,為什么?
這就要引入模運算了
取模就是取余數運算符為mod,如5 mod 2 = 1,也就是5 / 2 余 1
我們就可以發現
(10 - 3) mod 12 = 7 mod 12 = 7
(10 + 9) mod 12 = 19 mod 12 = 7
原來是 7 和 19 除以 12 的余數是相同的才有這樣的結果
那么這個 9 也就是 -3 在這種情況下的補碼
那么這個9是怎么的出來的呢?
( 10 ? 3 ) m o d 12 = [ ( 10 m o d 12 ) ? ( 3 m o d 12 ) ] m o d 12 = [ ( 10 m o d 12 ) + ( 12 m o d 12 ) ? ( 3 m o d 12 ) ] m o d 12 = ( 10 + 12 ? 3 ) m o d 12 (10 - 3) mod 12 \\ = [(10 mod 12) - (3 mod 12)] mod 12 \\ = [(10 mod 12) + (12 mod 12) - (3 mod 12)] mod 12 \\ = (10 + 12 - 3) mod 12 (10?3)mod12=[(10mod12)?(3mod12)]mod12=[(10mod12)+(12mod12)?(3mod12)]mod12=(10+12?3)mod12
原來是用12 - 3算出來的9
我們講表盤中的數字列舉出來
1 2 3 4 5 6 7 8 9 10 11 12
在將12換成0
0 1 2 3 4 5 6 7 8 9 10 11
這個12 就是這一串數字所能表達的最大數加一
那么補碼 = 能表示的最大數加一 - 減數
補碼
讓我們根據上面的例子,將計算變成二進制的形式
假設有8為二進制數
能表示最大的數就是11111111
加一后就是100000000
如果要求出 -1010 的補碼 絕對值就是00001010(因為上面是減去的3而不是-3)
就用100000000 - 00001010 = 11110110
所以 11110110 就是 -1010 的補碼
驗算:用10000 - 1010
00010000 - 00001010 = 00000110
00010000 + 11110110 = 100000110 = 00000110
總結更一般的公式
[ ? x ] 補 = 2 n ? x [-x]_補=2^n-x [?x]補?=2n?x
我們會發現用
11111111 - 00001010 = 11110101
正好是00001010的取反
而
11111111 = 2 n ? 1 11111111=2^n-1 11111111=2n?1
所以
( 2 n ? 1 ) ? x + 1 = 2 n ? 1 (2^n-1)-x+1=2^n-1 (2n?1)?x+1=2n?1
所以補碼還可以這樣算
[ ? x ] 補 = [ x ] 反 + 1 [-x]_補=[x]_反+1 [?x]補?=[x]反?+1
如:
[ ? 1010 ] 補 = [ 00001010 ] 反 + 1 11110101 + 1 = 11110110 [-1010]_補=[00001010]_反+1 \\ 11110101+1=11110110 [?1010]補?=[00001010]反?+111110101+1=11110110