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