本来工作内容已经与硬件无关了,但闲暇时突然想到了一个问题,为何要有补码,为何负数的补码=对应的反码+1?
计算机中的运算是交给ALU完成的,ALU中是没有减法操作的,因此如果能用加法代替减法是再好不过的了。恰恰数学中有这样的规则,我们可以利用加负数来代替减正数,因此任务就变成了负数的合理化表示,下面做详细陈述。
要合理化表示负数,那么就要给出合理化表示的要求:
负数的合理化表示要求一:与正数的集合没有交集,同样一组01串不会产生歧义,这个不难解决,增添一个符号位即可。
负数的合理化表示要求二:一个正数与其对应的负数(即数学上的相反数)相加为0。
第二点实现不易,因为在只有加法运算的规则下,产生0只能靠0+0或1+1并产生进位,但有一点我们可以利用:那就是计算机是有字长的,只要在字长内的每个位是0即可表示0,哪怕在超出字长的位数中有1。顺着这个思路,我们取最简单情况,利用n位数值为都为0第n+1位为1表示0,我们写下如下的表达式:
设n位二进制正数a,其对应的负数为X,表达式为:
a+X=0 ---> a+X=2^(n+1)
后一个表达式已经很接近我们的答案了,但是X依然难以表示,我们依然需要对这个表达式进行合理的变形,等式的右边是2^(n+1),我们最好能将它变形成一个n位二进制数,这样便于下一步变形,那么等式两边同时减一我们得到这样的式子:
a+X-1=2^(n+1)-1 ---> a+X-1=111111.....(n个1)
-----> y=x-1,a+y=11111.......(n个1)
结合逻辑运算,我们就可以得到a与y的关系,即a=非y。则
x-1=非a
则:x=非a+1,别忘了非a就是a的反码,这样我们的到了一种合理的负数表示法。