核心在于:
对于范围为[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”的由来。
更深入:
[url]http://www.nowamagic.net/librarys/veda/detail/266[/url]
对于范围为[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”的由来。
更深入:
[url]http://www.nowamagic.net/librarys/veda/detail/266[/url]