计算机只会加法,那么它如何用加法来计算减法呢?

计算机中的加减乘除都是通过加法实现的,那么你肯定很好奇,加法和减法是完全不同的操作啊,如何用加法来进行减法运算呢?下面我就通过几个例子,来解释一下具体的操作过程。

二进制加法

开始之前,我们先复习一下最简单的二进制的加法是如何运算的:
在这里插入图片描述

二进制是逢二进一,1001+1101=10110 最高位直接进一位就行了。

十进制减法

大数减小数

我们来看一个十进制减法的例子:
在这里插入图片描述
251-174=77,很简单是不是?小学低年级的题目,个位不足向十位借位,十位不足向百位借位,我们是这么口算的。

这里用到了借位,如果我们不使用借位,能不能计算减法呢?

为了便于说明,我们先复习一下,减数,被减数,差的概念:
在这里插入图片描述
为了避免借位,我们用以下步骤来计算:
首先先用999减去减数174,得到差825:
在这里插入图片描述
然后用被减数251加上差825,等于1076:
在这里插入图片描述
最后,由于刚才第一步多借了999,现在要把多出来的999减掉。
为了避免借位,我们在多加一个1,999+1=1000 凑成 1000,然后减去1000,这样从头到尾就不会涉及到借位的问题。
1076 + 1 - 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)的加法操作,这种把减法变成加法的操作,是不是很神奇呢?









在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值