二进制的原码、反码、补码

参考资料:
【硬件科普】带你认识CPU第04期——CPU是怎么计算减法的】 https://www.bilibili.com/video/BV1fr4y1S7gG?share_source=copy_web&vd_source=a6ef3d7c0d7a2d3e56d9beb928586f35
https://zhuanlan.zhihu.com/p/99082236

预备知识

由于计算机的硬件决定,任何存储于计算机中的数据,其本质都是以二进制码存储。

根据冯·诺依曼提出的经典计算机提携结构框架,一台计算机由运算器、控制器、存储器、输入和输出设备组成。其中运算器只有加法运算器,没有减法运算器(据说一开始是有的,后来由于减法运算器硬件开销太大,就废了)。

所以计算机中没办法直接做减法的,它的减法是通过加法实现的。现实世界中所有的减法也可以当作加法,减去一个数可以看作加上这个数的相反数,但前提是要有负数的概念,这就是引入符号位的原因。符号位在内存中存放的最左边一位,如果该位为0,则说明改数为正;若为1,则说明该数为负。

原码、反码、补码的产生过程就是为了解决计算机做减法和引入符号位的问题。

1 原码

原码的定义(n位):
在这里插入图片描述

1.1 什么是原码

原码:是最简单的机器数表示方法,用最高为表示符号位,其它位存放该数的二进制绝对值。

最高位为1表示这是一个负数,最高位为0表示这是一个正数

可以发现出现了 +0 和 -0

在这里插入图片描述

1.2 原码的计算

0001 + 0010 = 0011,1+2=3

0000 + 1000 = 1000,+0+(-0)=-0

0001 + 1001 = 1010,1+(-1)=-2

可以发现,用原码做正数之间的加法通常是不会出错的,而正数与负数相加,或负数与负数相加,就要引起错误

1.3 原码的特点

  1. 原码表示直观、易懂、与真值转换容易

  2. 原码中0有两种不同的表示形式,给使用带来了不便。

    通常0的原码用+0表示,若在计算中出现了-0,则需要用硬件将-0变成+0

  3. 原码表示加减运算复杂。

    利用原码进行两数相加的运算时,首先要判别两数符号,若同号则做加法,若异号则做减法。再用原码进行两数相减运算时,不仅要判别两数符号,使得同号相减,异号相加;还要判别两数绝对值的大小,用绝对值大的数减去小的数,取绝对值大的数的符号作为结果的符号。

2 反码

2.1 什么是反码

原码最大的问题就在于一个数加上它的相反数不等于0,于是反码的设计思想是为了解决这一点,既然一个负数时一个正数的相反数,那干脆用一个正数按位取反来比表示负数。

反码:正数的反码还是等于原码;负数的反码就是它的原码除符号位外,按位取反。
在这里插入图片描述

2.2 反码计算

试着用反码的方式解决一下原码的问题——

0001 + 1110 = 1111,1+(-1)=-0

1110 + 1100 = 1010,(-1)+(-3)=-5

互为相反数相加等于0,虽然是1111也就是-0。但是两个负数相加出错了。

2.3 反码的特点

  1. 在反码表示中,用符号位表示数值的正负,形式与原码相同,即0为正;1为负。
  2. 在反码表示中,数值0有两种表示方法。
  3. 反码的表示范围与原码表示范围相同。

反码表示在计算机中往往作为数码变换的中间环节。

3 补码

补码的定义(n位):
在这里插入图片描述

补码:正数的补码等于它的原码,负数的补码等于反码+1(这只是一种算补码的方式)

负数的补码等于反码+1只是补码的求法,而不是补码的定。

3.2 补码的思想

补码的思想类似生活中的时钟。

如果说现在时钟停在10点,那么什么时候会停在八点钟呢?

过去隔两小时是八点钟,未来过十小时的时候也是八点钟。

也就是说时间倒拨2小时,或正拨10十小时都是八点钟。

也就是10-2=8,而且10+10=8

这时候满12,说明时针在第二圈,又走了八小时,所以时针又正好停在八点钟。

所以12在时针运算中,称之为模,超过了12就会重新开始计算1了。

12 就是时钟的模

  • -2 等价于 +10 (mod 12)
  • -4 等价于 +8(mod 12)
  • -5 等价于 +7(mod 12)

对于模运算来讲,加上一个负数和加上这个数的补数是等价的

补码用的也是这样的思想,列子:

假设有一个可以计算和存储4bit,即四位二进制的计算机系统,那么这个计算机系统可以存储的二进制数的范围就是0000-1111

当计算:1111+0001时就会成为一个五位数,10000,由于这个系统只能容纳4位二进制数,最高位的1溢出,在系统中无法被表示出来会被舍弃,所以最后的结果就是 0000

5的原码为:0101

当我们想加上一个数让他变为0000,我们可以加上一个数,使其结果变为1111,再加一造成溢出,就可以得到0000

想让0101变成1111,我们只要加上1010,刚好就是0101取反。1010刚好就是-5的反码

1111 1000

所以0101+1011=10000,想让1010成为0000只需要加上1011,而1011就是-5的补码,也就是-5的反码+1

在计算机中,正数的补码和原码是相同的,而负数的补码等于其绝对值的原码按位取反再+1,补码的最高位也代表符号位,0代表正,1代表负,与原码不同,补码的符号位可以直接参与运算

注意:原码和反码0的表示不唯一(原码0000和1000都是0,反码0000和1111都是0),所以四位原码和反码都只能表示-7-+7十五个数。而补码的0表示唯一(即0000),所以四位补码可以表示-8到+7十六个数

在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值