第二章番外、原码|反码|补码的运算及其原理探讨

  今天看书看到第二章,看到有符号数和无符号数这里,实在是有点难受,又想起了以前老师在课堂上绕来绕去,什么负数的补码 = 原码符号位不变,其余位按位取反再加1 = 反码 + 1,这个公式不难,就是不好记,我已经第三回记这个公式了。。正好今天看博客,看到有dalao的评论说的很好,那我就拿来综合记录一下,下面来探讨探讨这三个的运算。

首先,我们也先来老调重弹一下原码、反码及补码的意义和计算规则,这是大家都学过的,所以先拿出来看一下:

  • 原码:最常用于计算机内部运算和数据传输。
  • 正的原码,它的反码和补码还是其本身。
  • 负的原码,它的反码 = 原码的符号位不变,其余位取反。
  • 负的原码,它的补码 = 原码的符号位不变,其余位取反,再加1。

  是不是感觉有点绕,想要彻底理解原码、反码、补码,还得了解它背后的逻辑。即这些数在实际中是用来干什么的?
  想一下前一章我们所提到的,计算机的组成与设计的终极目标,就是为了加速运算!因此,这里也同理。那么原码、反码和补码的提出,就是为了替代掉减法,使得减法运算在计算机中也变成加法运算的形式。

那就举个例子来看一下吧:

首先,先看一下计算机中的溢出,假设有一个4位的二进制数为1111,那
1111 + 1 = 1 0000 吗?
很明显,我们这个数只有4位,因此,1111 + 1 = 0000。溢出的第五位被自动舍弃了。

了解了这个之后,再结合之前的原码、反码、补码计算公式,我们接着往下看:
  假设我们有一个数是-1,它是一个4位二进制数,4位二进制数的周期就是24 (0000 - 1111,一共16个数,超过1111,就舍掉第五位,从0000重新开始)。
  根据计算公式,我们能很轻松的得到-1(1001)的补码是15(1111)。
  同理,我们再随便挑一个负数,比如说是-5(1101),根据计算,-5的补码是11(1011)。

  发现规律了吗!

   |原码| + 补码 = 周期

Tips: |原码|表示原码的绝对值
可能会有疑问,为什么上面说的15 和 11 它们前面的1不算负数的符号位呢?接下来继续看。

自此之后,我们在做计算时,只需要做加法就行。直接用-5的补码 11 ,当作 -5 来用,例如
我们要计算 10 - 5
换算成加法! 原式 = 10 + 11 = 21 -------------------[这里的11是-5的补码]
还记得我们的周期是24=16(1111)吗,再把高于4位的全部舍弃掉
那原式 = 21 - 16 = 5!
这样一来,原来的减法计算就全部化成了加法计算。这样计算机在计算时,就只需要用到加法器,省去了减法,简化了操作,加快了效率。

最后,我们回到之前留下的伏笔,为什么上面把1111说成是15,而不说是-7;为什么上面把1101说成是11,而不说是-5呢?
  因为,计算机都采用二进制补码来表示有符号数!!!1111表示的是补码,而非普通二进制数。为了方便理解,我们可以把补码换算成10进制数去计算。但是在计算机眼中,补码是另一种样子,还拿4位二进制来说,它们对应关系如下:

二进制(原码)0001001001111000100110101111
换算成十进制127891015
计算机眼睛中的数(补码)127-8-7-6-1

  所以,当计算机在计算 7 - 5时,其实在计算机眼中的是
0111(7的原码) + 1011(-5的补码) = (1) 0010 = 0010 = 2
从十进制的视角来看就是 7 + 11 - 16(周期) = 2

最后,重点是这个公式|原码| + 补码 = 周期,它成立有个前提条件,就是一定要限定位的个数,并且到达上限会抹去高位。(例如4位2进制数,计算后,如果溢出产生第五位,直接抹去)

Ps: 在使用反码时,加法器还需要一个额外的步骤,即取反后,换算成补码计算还要再加一。因此,现在计算机中还是补码占主导地位(反码基本不咋用)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值