计算机中的加减乘除都是通过加法实现的,那么你肯定很好奇,加法和减法是完全不同的操作啊,如何用加法来进行减法运算呢?下面我就通过几个例子,来解释一下具体的操作过程。
二进制加法
开始之前,我们先复习一下最简单的二进制的加法是如何运算的:
二进制是逢二进一,1001 1101=10110 最高位直接进一位就行了。
十进制减法
大数减小数
我们来看一个十进制减法的例子:
251-174=77,很简单是不是?小学低年级的题目,个位不足向十位借位,十位不足向百位借位,我们是这么口算的。
这里用到了借位,如果我们不使用借位,能不能计算减法呢?
为了便于说明,我们先复习一下,减数,被减数,差的概念:
为了避免借位,我们用以下步骤来计算:首先先用999减去减数174,得到差825:
然后用被减数251加上差825,等于1076:
最后,由于刚才第一步多借了999,现在要把多出来的999减掉。为了避免借位,我们在多加一个1,999 1=1000 凑成 1000,然后减去1000,这样从头到尾就不会涉及到借位的问题。
整个公式就是:251 (999 - 174) 1 - 1000 = 77 你有没有发现,这样就把借位的问题避开了哦。
小数减大数
如果是174-251该怎么办呢?
情况稍有不同,前面的步骤还是一样的。先用999-251=748
然后用被减数174加上差748,等于922:
按照前面的例子,现在应该是 922 1 - 1000 了,但是这样就涉及到借位了,这里我们要变通一下,直接用999 - 922,然后在结果前面加个负号:
999 - 922 = 77,我们直接在77前面加个负号,-77就是正确结果啦,这样我们就可以避开借位问题啦。
二进制如何表示负数呢?
二进制表示正负数时,一般会把最高位当做符号位,符号位0表示正数,1表示负数,那么-1用二进制怎么表示呢?
1用二进制表示为00000001,所以推算一下-1应该就是10000001吧?
让我们来验证一下,看看对不对,十进制 1 (-1)= 0,二进制 00000001 10000001 = 10000010 很明显不等于0 啊。
我们知道二进制1是00000001,那么我们倒推一下,00000001加上什么数会等于00000000呢?
想来想去都想不到啊,不知道你有没有发现,计算机是没有减法运算的,计算机的减法是通过加法实现的,那么加法怎么能达到减法的效果呢?
我们看下这个例子:
1 00000000超出了一个字节的范围,最高位1被舍弃,剩下的就是 00000000,这就是十进制的0啊,推理可得-1用二进制表示就是11111111,好神奇。
「原来二进制的负数表示叫做补码,补码的转换规则是正数的取反再加1」,比如:00000001 取反就是 11111110,然后再加1就是11111111,这就是-1的二进制表示了。
「仔细想想所谓补码,就是加起来等于11111111的码啊,然后再加1,最高位溢出后,不就等于0了吗,一个和原来的数加起来等于0的数不就是它的负数吗?」
这么想是不是就容易理解了呢?
换个角度看看,-174的补码就是(999-174) 1 = 826 ,174 (-174)其实就是 174 826 = 1000 ,然后舍弃掉前面的1,结果就是0了,所以补码就是加起来会向高位进一位的数。
下面,我们来看看补码的定义:
❝「补码」(英语:2's complement)是一种用二进制表示有号数的方法,也是一种将数字的正负号变号的方式,常在计算机科学中使用。补码以有符号比特的二进制数定义。 正数和0的补码就是该数字本身。负数的补码则是将其对应正数按位取反再加1。 补码系统的最大优点是可以在加法或减法处理中,不需因为数字的正负而使用不同的计算方式。只要一种加法电路就可以处理各种有号数加法,而且减法可以用一个数加上另一个数的补码来表示,因此只要有加法电路及补码电路即可完成各种有号数加法及减法,在电路设计上相当方便。 另外,补码系统的0就只有一个表示方式,这和反码系统不同(在反码系统中,0有二种表示方式),因此在判断数字是否为0时,只要比较一次即可。 ❞
二进制减法
好了,我们知道了补码的概念之后,再来看看二进制数的减法。
大数减小数
251-174 转换成二进制就是 11111011 - 10101110 ,还记得我们上面不用借位的公式吗?
251 (999 - 174) 1 - 1000 = 77 ,其中 「(999 - 174) 1」就是-174的补码,对应二进制10101110的补码就是先取反01010001,然后再加1,01010001 1 = 01010010
然后11111011 和补码 01010010 相加,最高位超过8位,溢出了,直接去掉不要,就是最终结果01001101,即为十进制的77。
这样通过补码,就能把减法用加法实现了。
小数减大数
如果是174-251用二进制计算该怎么办呢?10101110 - 11111011 ,同样的我们先计算11111011的补码:
然后10101110再和补码00000101相加:
10110011的十进制是179,结果也不对啊,别急,因为174比251小,相减的结果肯定是负数,计算机的负数是用补码表示的,所以10110011肯定是表示一个补码,「一个数补码的补码就是他自己」,相当于负负得正,我们再计算10110011的补码:
得到01001101,十进制是77,一个数的补码是77那么这个数肯定就是-77啦,所以10110011表示的是-77的补码,而不是179。
最后的话
最重要的是,我们要知道补码的概念,以及补码的转换规则“「正数的取反再加1」”。
计算机巧妙的用补码来表示负数,然后通过和一个负数(补码)相加,来实现减法的操作。
例如:把减法251-174 变成 251 (-174)的加法操作,这种把减法变成加法的操作,是不是很神奇呢?