从减法的角度考虑原码、反码、补码的设计

计算机要存储数据,必须使用二进制,那么我们要怎么存储二进制呢?

有的人会说这不是废话,直接将十进制转换成二进制不就好了?

是的,直接转成二进制是可以使用的,所以直接转成二进制这种办法我们称之为原码。

看起来原码好像很不错,能够完成加减法....慢着,加法可以满足,比如1000+0100=1100,这没什么问题,但减法呢?

诶??

好像设计后没有减法什么事情?

不能计算减法的计算机算什么计算机啊?所以我们现在的核心目的就是研究出怎么用二进制表示减法。


这个问题我们先放在这里,先想一个生活中的例子

小明有一块钟表,时针停留在了3的位置,小明想把时针调到1的位置,请问小明该如何操作?

很明显有两种办法:一是回推2小时,二是顺着推10小时。

 

也就是上图里的两种方式:3-2=1和3+12-2=13

大家都知道13点就是下午1点,这正是因为13是12进制下的1。


好了通过上面的小例子,大家能明白想要实现使某个值转化为另一个值是有两种办法的:即顺着推和逆着推。

这个时候应该有人可以意识到逆着推相当于计算中的减法,那么同样的,我们是不是可以使逆着推的减法变成顺着推加法呢?

就好像时钟的例子,3-2=3+12-2,多转一圈相当于不转,也就是多加上一圈的进制值,12进制就多加上12,10进制就多加上10,2进制就多加2。

那么这里还是存在一个问题,上面的10是通过12-2得到的,还是要计算减法啊。

因为12进制解释这个问题不够直观,所以我们回到十进制解释这个问题。

比如-2,在十进制里应该等同于10-2=8,但是我们的目的是解决减法问题,自然不能用10-2这种办法,但是我们可以用9-2。为什么呢?因为10-2需要借位,换成两位数24,那么需要用100去减,每一位都需要借位,如果用9-2,则不需要,直接可以得出7。那么问题来了,借不借位有什么关系呢?不都是减法?

关系大了。因为7是可以不用减法计算出来的,7可以直接用取反的操作得到。取反就是用该进制下每一位所能表示的最大值(十进制下的9,二进制下的1)减去当前值(如上例2),直接得出。

关键来了,十进制的取反我们可能还需要减法进行计算,但是我们在计算机中使用的是二进制,二进制的取反不需要减法。

好了到这里我们也就引出了反码的概念,即全部位取反,但是又有一个问题,我们前面说的是进制值去减啊,现在变成了反码,好像差了点什么,没错,差了1。

举个例子,32-26=6,-26的反码是99-26=73,73+32=105,比106少了1,其等式应该是:32+100-26-100=32+(99-26+1)-100。

所以我们在反码的基础上加个1,就能正常参与计算了,这个反码加1的东西,就是补码。

这就是原码反码补码之间的关系和逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值