【Tools】彻底搞懂原码,反码,补码和变补。

前言

今天看到微机原理里面提到

对一个负数取补码相当于用0减去一个负数

一下子没有反应过来,不由得去找了一些资料,这里简单总结一下。以下内容大部分参考这个知乎大佬写的文章

原码,反码,补码

  首先我们先来复习一下原码,反码和补码。
  我们都知道,现代计算机都是以二进制来表示数的,那为了能够表示负数,人们约定,最高位用来表示符号位,0代表正数,1代表负数。这就是原码。但是呢,这个原码有很多问题,一个就是只能计算正数与正数相加,负数参与运算会出错(因为有符号位参与运算),另一个就是0有两种表示法:+0和-0。
  原码最大的问题其实是两个相反数相加不为0(因为只有符号位不同),因此人们又发明了反码:正数和0的反码等于它本身,负数的反码等于除符号位的其他各位按位取反。这样一来就保证了两个相反数相加的结果是0。但是仍然有问题,那就是负数相加会出错,且0仍然有两种表示方法。
  为了解决负数加减的问题,最后提出了补码的概念。补码等于反码加1,这句话只能算是一种运算规律,因为补码概念的提出与反码没有任何关系,它的思想来自于生活最常见的“模”的思想,比如时钟。具体可以去知乎看看相关文章。

补码的美妙与神奇之处

  • 补码的最高位仍然代表了这个数的符号,即0为正数,1为负数,且0只有一种补码表示方法
  • 其实通过补码是可以直接算出真值来的! 以4位寄存器为例,1011为-3,它的补码为1101,那么当我们只知道1101时,可以将最高位赋予权值-8,再代入计算:-8*1+4*1+0*2+1*1=-3,正确!因此也体现出补码最高位符号位的重要性。
  • 补码的补码等于原码! 这一点我觉得十分巧妙,其实本质就相当于是数值取了两次模,这样就得到原值。

一直被混淆的“变补”

  相信很多人都听过一句话:“减去一个数相当于加上这个数的补码”。如果不去仔细验证,按照补码的思想,很容易认为这句话是对的,但实际上这里混淆了一个非常重要的概念,那就是补码变补的关系。
  补码如前所述,属于一种码制,其思想来源是生活中常见的取模思想。而变补是一种运算方法,它的提出是因为计算机的CPU中的运算器ALU只是加法计算器,不能计算减法,因此在计算A-B这样的表达式时,只能转化为A+(-B),因此,就需要一种二进制位层面的求相反数的方法。对于原码而言,求相反数就是将最高位的符号位取反即可,但是在实际加法运算中,数都是用补码表示的,因此需要当一个数为补码时应该怎么快速求出其相反数,这种运算就叫变补
  变补运算的方法就是补码所有位(含符号位)按位取反,然后加1,相当于是原码变补码的一个扩展版,因此很多人会混淆这二者的关系。
  总结来说:变补运算可以实现:补码A - 补码B = 补码A + 补码B的变补运算值,因此,也就有了文章开头的那句结论,其中的“补码”实际上是指变补运算。

  • 15
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记录无知岁月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值