這兩天數(shù)電課說(shuō)了補(bǔ)碼這個(gè)概念,可是為什么補(bǔ)碼可以代替負(fù)數(shù)做運(yùn)算,書(shū)上沒(méi)有說(shuō)清楚,按位取反再加一的原因書(shū)上也沒(méi)說(shuō)太清楚,在這里我說(shuō)一點(diǎn)我的看法。
首先說(shuō)一下模的概念,對(duì)于范圍是【0,m-1】的整數(shù)計(jì)量單位,其模為M,和為M的兩個(gè)數(shù)互為補(bǔ)數(shù),就像時(shí)鐘,計(jì)量單位是[0,11],那么模就是12,7與5就互為補(bǔ)數(shù)。
如果兩個(gè)整數(shù),a,b∈【0,m-1】,那么,定義一個(gè)映射f,
使f(a-b)=f(a+c), 其中,c=m-b,是b的補(bǔ)碼, f定義為
當(dāng)0≤x<m時(shí),f[x]=x;
當(dāng)x≥m時(shí),f【x】=x%M(此處為模運(yùn)算,學(xué)過(guò)C的應(yīng)當(dāng)知道);
當(dāng)x<0時(shí),f[x]=f(m-(-x)%m)……… 此處是為了保證自變量為正數(shù);
這三個(gè)公式可以由計(jì)算機(jī)原理的溢出來(lái)隱式實(shí)現(xiàn),于是天生就有 a-b=a+c ,所以減運(yùn)算變成了加運(yùn)算,于是計(jì)算機(jī)把-b表示成了補(bǔ)碼c;
現(xiàn)在說(shuō)一說(shuō)取反加一的問(wèn)題,假設(shè)計(jì)算機(jī)上的機(jī)器字有n位,那么就有m=2n,所以c=2n-b,人在紙上怎么計(jì)算c=2n-b的值呢,是這樣的: 的原碼是1后面跟n個(gè)0,直接用來(lái)減b的原碼不方便,于是就先用2n-1(n個(gè)1)減b的原碼,得到的結(jié)果再加上一就是2n-b的值,這就是計(jì)算機(jī)類書(shū)籍上說(shuō)的“取反加一”
數(shù)學(xué)中的整數(shù)相加,仍然是一個(gè)整數(shù),但是一個(gè)集合內(nèi)的兩個(gè)整數(shù)相加,卻不能保證還在這個(gè)集合內(nèi),用代數(shù)的術(shù)語(yǔ)來(lái)講,叫做 "不滿足封閉性",這是個(gè)很壞的性質(zhì),而補(bǔ)碼的提出就是為了用封閉的運(yùn)算來(lái)解決這個(gè)問(wèn)題,
當(dāng)然,這都是個(gè)人理解,歡迎指正,順帶說(shuō)一句,這是我和謝奇同學(xué)的討論結(jié)果。