補(bǔ)碼的原理及隨想
越早在課堂上學(xué)的東西,越給我以簡單的印象,忘得也越快。而事實(shí)上,它們往往是最富有智慧的,即便在我沒忘的時(shí)候,也沒有深刻地理解它們。
嘛是補(bǔ)碼?不少書上扯一堆“取反加1”之類的規(guī)則,很不著重點(diǎn),我覺得核心在于:
對于范圍為[0,M)的整數(shù)計(jì)量系統(tǒng),其模為M。和為M的兩個(gè)數(shù)互為補(bǔ)數(shù)。
如果有兩個(gè)整數(shù)a,b∈[0, M),那么f(a-b)==f(a+c),其中c= M-b,是b的補(bǔ)碼,f是一個(gè)映射,定義為:
當(dāng)0<=x< M時(shí),f(x)=x;
當(dāng)x>= M時(shí),f(x)=x % M;
當(dāng)x<0時(shí),f(x)=f(M +x).
其中%為取余運(yùn)算(效果同編程語言中的取模運(yùn)算)。
在計(jì)算機(jī)中,f是由溢出隱式實(shí)現(xiàn)的,所以天生就有a-b==a+c。這就把減運(yùn)算轉(zhuǎn)化成了加運(yùn)算。
于是,為了便于執(zhí)行減運(yùn)算,計(jì)算機(jī)就把-b表示為其補(bǔ)碼c。
假設(shè)機(jī)器字有n位,那么M=2n,c=2n-b。
人在紙上怎么計(jì)算2n-b的二進(jìn)制值?2n的原碼就是1后面跟了n個(gè)0,直接用它減b的原碼不方便,先用2n-1的原碼(n個(gè)1)減b的原碼,得到的結(jié)果加上1就是2n-b的值了——這就是“取反加1”的由來。