1. 問題
我們知道,在計算機中是用補碼來存放實際的正負(fù)數(shù)的,那么計算機為什么要用補碼來存放數(shù)據(jù),計算機課本中,那個補碼 = 反碼 + 1的公式又是怎么來的?
要了解這些問題的答案,我們先要了解一些基本的知識,最基本的同余公式這里就不講了,看本帖之前需要去離散數(shù)學(xué)或數(shù)論中了解下基本的同余運算即可。
2. 計算機的字長和同余計算
計算機的字長是指計算機運算時,能存放的最大數(shù)字的的位長,如我們常說的32位機,字長就是32位的,寄存器只有32bit,最多能放32個1,能表達的最大數(shù)字就是232 - 1
當(dāng)超過這個數(shù)字后,由于無法存儲,會被計算機丟棄,同時會設(shè)置CPU的溢出標(biāo)志位,這就是所謂的溢出
為了簡單,我們用8位機來做演示,即最大能表示的數(shù)字是28 - 1
記m = 28
所以,計算機的計算 (a + b)時,實際上計算的是 (a + b) % m (mod m),超過m的部分都會被丟棄,只取余數(shù)的部分,即計算機中的計算實際都是一個模m的同余計算
如 1000 0000 + 1000 0001 = 1 0000 0001
由于最高位超出最大能夠表示的數(shù),多出的位將溢出丟棄,所以最后的結(jié)果為 0000 0001 = 1
3. 補碼的定義和計算
設(shè)m > b >= 0,b為整數(shù)
則b的補 b = m – b (注意,這里定義的是補,而不是補碼,不要弄混了)
由于有正負(fù)數(shù),計算機中對正負(fù)數(shù)的補碼進行了區(qū)分定義:
1> 正整數(shù)b的補碼為自身,即b的補碼仍為b
2> 負(fù)整數(shù)-b的補碼為b的補,即b
我們知道,a - b即可轉(zhuǎn)化為 a + (-b),如果用補碼來運算
a – b = a + (-b) (mod m) 在計算機中計算的是 a + b (mod m)
那么他們的同余嗎