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)

那么他們的同余嗎