计算机补码学习

补码:按位取反,末位加一。很简单,容易记,但是为什么要这么做?
首先是补码出现的原因。
第一:简化计算机的减法计算,避免出现借位的情况。
以十进制为例,如果要计算200-199,无可避免的要进行两次借位,每一次借位,要保存几个数据,借了多少、借位后的数据是多少、被借的数据成了多少,这样就需要很多原件来保存,也需要做许多操作,这明显是很不好的。
如何避免借位?
如果将200-199,转换成200+(999-199),这样在计算999-199的时候,就完全可以避免借位,但是在加上200后,再减去多余的999,又不可避免的产生了借位,这样又不行了。
这种情况下,被减数(200)大于减数(199),这样的话,200+(999-199)的值必然大于1000,也就是由三位数变成了四位数,其结果值所在区间是1000-1999之间。这个结果,提供了减去999不借位的可能性。
在这个规律下,不再减去999,而是加上1,然后减去1000。这样就可以避免借位,然后实现减法了。所以完整的计算公式就是200+(999-199)+1-1000=1。
其中的999-199,就是十进制形式的按位取反。写成二进制的形式就是111-010=101,这样的形式。 

第二:节约计算空间。
这里解释为什么要加一。
上面将999补成1000,其实也算是要加一的原因之一。
另外一个原因就是节约计算空间。某种情况下,我们要表示-500到+499,如果加符号位,我们需要4位来存储,实际上只要3位就足够了。因为三位数可以表示0-999,正数,我们只用了0-499之间的范围,500-999的范围完全被浪费掉了,所以完全可以用500-999的数字来表示-500--1之间的数。
就是用999表示-1,998表示-2,以此类推。
但是如果只是这样,用补码就可以了,何必要加一,再推出个补码呢?因为-0和+0,在加减法运算中是毫无意义的。所以原来用以表示-0的999就没有了意义了,所以就移一位,原来用999表示-0的,现在就用999表示-1。

正数补码的计算和负数补码的计算
设要求补码的数为X,那么计算公式就是999+X+1。
以10为例:999+10+1=1010,进位舍弃,就是10。所以正数的补码就是其本身。
以-10为例:999+(-10)+1=990,所以,-10的补码就是990。

补码的应用
200-190=200+999-190+1-1000=200+(999-190+1)-1000
看到这个式子,应该就很熟悉了,减数已经转换成补码的形式在参与运算了。当然被减数是正数,正数的补码是其本身,自然也就是补码形式的。这也是为什么经常会看到有人说计算机中的数都是以补码形式存在的原因了。
理解了这些,补码也就不难理解了,也就没有必要再去背什么“按位取反,末尾加一”,纠结什么“符号位要不要参与取反了”。

备注:这里都是以十进制作为讲解数的,方便理解,二进制也是同样的道理,可以依次类推。十进制中的999,和二进制中的111是同等意义的,都是某位数内,能够表示的最大的数。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值