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

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

二进制加法

开始之前,我们先复习一下最简单的二进制的加法是如何运算的:

6fe4a1b7bffb14602a8db4f01cda761e.png

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

十进制减法

大数减小数

我们来看一个十进制减法的例子:

196b4091f20542c3a0ebf58758bf29c1.png251-174=77,很简单是不是?小学低年级的题目,个位不足向十位借位,十位不足向百位借位,我们是这么口算的。

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

为了便于说明,我们先复习一下,减数,被减数,差的概念:

1b79692f55eabe9838d0d9d12edc62ad.png为了避免借位,我们用以下步骤来计算:首先先用999减去减数174,得到差825:

8f1754248d3db345d79a43e4aed162db.png然后用被减数251加上差825,等于1076:

f3f4728726bd58de70084ec2f50e8050.png最后,由于刚才第一步多借了999,现在要把多出来的999减掉。为了避免借位,我们在多加一个1,999+1=1000 凑成 1000,然后减去1000,这样从头到尾就不会涉及到借位的问题。

0ea781baa4f8bd7981cc01396fc780cc.png

整个公式就是:251 + (999 - 174)+ 1 - 1000 = 77 你有没有发现,这样就把借位的问题避开了哦。

小数减大数

如果是174-251该怎么办呢?

63e06c8161d75beae3f8cbef04260096.png情况稍有不同,前面的步骤还是一样的。先用999-251=748

8164d6dc4dd20aefdcc61e8b14e80f8d.png然后用被减数174加上差748,等于922:

81b9d44b0421da43e0e5cf9efd17f63b.png按照前面的例子,现在应该是 922 + 1 - 1000 了,但是这样就涉及到借位了,这里我们要变通一下,直接用999 - 922,然后在结果前面加个负号:

998cd3c7cfcf77d08387292383a5acfd.png999 - 922 = 77,我们直接在77前面加个负号,-77就是正确结果啦,这样我们就可以避开借位问题啦。

二进制如何表示负数呢?

二进制表示正负数时,一般会把最高位当做符号位,符号位0表示正数,1表示负数,那么-1用二进制怎么表示呢?

1用二进制表示为00000001,所以推算一下-1应该就是10000001吧?

让我们来验证一下,看看对不对,十进制 1 +(-1)= 0,二进制 00000001 + 10000001 = 10000010 很明显不等于0 啊。

我们知道二进制1是00000001,那么我们倒推一下,00000001加上什么数会等于00000000呢?

想来想去都想不到啊,不知道你有没有发现,计算机是没有减法运算的,计算机的减法是通过加法实现的,那么加法怎么能达到减法的效果呢?

我们看下这个例子:

624dc6f4d53cd38069f99bb82d87f8db.png

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了,所以补码就是加起来会向高位进一位的数。

9325078e834e491a62444e916d89c700.png

a3f547aa30bdbada823564039e191e8f.png

下面,我们来看看补码的定义:

「补码」(英语: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

0dbffca344b11d8f7a3252aa219ef89b.png然后11111011 和补码 01010010 相加,最高位超过8位,溢出了,直接去掉不要,就是最终结果01001101,即为十进制的77。

80b8b51a9b2b49113a5805b6e22fafe3.png这样通过补码,就能把减法用加法实现了。

小数减大数

如果是174-251用二进制计算该怎么办呢?10101110 - 11111011 ,同样的我们先计算11111011的补码:

3de2cb826ae8d9ea57a007f12b2c338f.png然后10101110再和补码00000101相加:

6d46d0ff8f6216c229d7f849798ef4b0.png10110011的十进制是179,结果也不对啊,别急,因为174比251小,相减的结果肯定是负数,计算机的负数是用补码表示的,所以10110011肯定是表示一个补码,「一个数补码的补码就是他自己」,相当于负负得正,我们再计算10110011的补码:

8ef9f66be44e3bf99d3a1eaf265e0b11.png得到01001101,十进制是77,一个数的补码是77那么这个数肯定就是-77啦,所以10110011表示的是-77的补码,而不是179。

最后的话

最重要的是,我们要知道补码的概念,以及补码的转换规则“「正数的取反再加1」”。

计算机巧妙的用补码来表示负数,然后通过和一个负数(补码)相加,来实现减法的操作。

例如:把减法251-174 变成 251 + (-174)的加法操作,这种把减法变成加法的操作,是不是很神奇呢?

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值