越早在课堂上学的东西,越给我以简单的印象,忘得也越快。而事实上,它们往往是最富有智慧的,即便在我没忘的时候,也没有深刻地理解它们。
嘛是补码?不少书上扯一堆“取反加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”的由来。