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