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