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)

那么他們的同余嗎

網(wǎng)友評論