原码反码补码原理理解

基础知识

说原码反码补码,我不想说他们的定义或者是算法。我只想请诸君随我一同解决一道题。
7 - 3 = ?(均为十进制)
这道题的答案相信各位能脱口而出,但是把这道题放到计算机中,计算机可就犯难了,首先我们计算机需要运算的是二进制数据,其次我们计算机中的运算位却只有加法运算器却没有减法计算器。那我们怎么完成数字的减法呢?

很简单,加上一个减数的相反数就行了。

可是减数(一定是正数)的相反数一定是负数,而负数前面的符号怎么解决呢?这就不得不引入符号位了。

其实原码反码补码本质上就是为了解决计算机在作减法时和引入的符号位之间的问题!

原码

定义

原码就是将一个数转换为二进制,第一位(即最高位)表示这个数的符号,1位负号,0为正号

例如(以带符号位的四位二进制数为例)

3 的原码是0011(其中0代表3是个整数,011代表3的二进制表示)
-3 的原码是1011(其中1代表-3是个负数,011代表3的二进制表示)

在这里,我们模仿一下计算机对数据运算的过程!

1.我们将3和4输入到计算机中进行加法运算,这里我们期望得到的数值为7
2.计算机将3和4分别转换为原码,3变成0011,4变成0100
3.计算机将3和4的原码相加,此时我们运用小学时便学过的方法按位相加
请添加图片描述
4.此时得到的结果与我们预期相吻合!

那么所有运算都是正确的吗?我们再试一组。

1.我们再将3和-3输入到计算机中进行加法运算,这里我们得到的期望数值为0
2.计算机将3和-3分别转换为原码,3变成0011,-3变成1011
3.计算机将3和-3的原码相加
请添加图片描述

4.此时计算机将会得到一个我们意想不到的答案!怎么可能3 + ( - 3 ) = - 6?

别慌,科学家们也意识到这个问题(即正数之间的加法不会出错,而正数和负数相加便会引起莫名其妙的结果),可这个问题该怎么解决呢?
于是便引入了反码!!!

反码

定义

我们知道,正数与正数的原码进行运算是没有问题的,可正数的和其相反数的原码相加便会出错。

例如:0011 + 1011 == 1111 (3 + - 3 = - 7)

所以反码便是为了解决这点(即将正数的相反数的原码与正数的原码相加不等于0)

反码:正数的反码还是原码,负数的反码是原码除了符号位以外,其余位数按位取反

在这里,我们模仿一下计算机对数据运算的过程!

1.我们再将3和-3输入到计算机中进行加法运算,这里我们得到的期望数值为0
2.计算机将3转换为反码,即3变成0011,然后由于-3是负数,计算机将-3的原码按位取反,即-3变成1100
3.计算机将3和-3的反码相加,得到1111(注意此时两个数的反码相加我们得到的也是一个数反码,并且这个数是个负数,我们需要在此将这个负数的反码转换为原码,即把1111除符号位以外按位取反,变成1000,即-0)
4.- 0 = 0,所以我们得到的结果符合我们的预期

我们再尝试一组

1.我们再将3和-5输入到计算机中进行加法运算,这里我们得到的期望数值为-2
2.计算机将3转换为反码,即3变成0011,然后由于-5是负数,计算机将-5的原码按位取反,即-5变成1010
3.计算机将3和-5的反码相加,得到1101(取反转换为原码后为1010即-2)
4.- 2 = - 2,所以我们得到的结果符合我们的预期

正数加负数也没问题了,那负数加负数会出错吗?我们来试一下!

1.我们再将-2和-3输入到计算机中进行加法运算,这里我们得到的期望数值为-5
2.计算机将-2的原码按位取反,即-2变成1101,然后计算机将-3的原码按位取反,即-3变成1100
3.计算机将-2和-3的反码相加,得到1001(取反转换为原码后为1110即-6)
4.- 6 不等于 - 5,所以计算机又出错了!

那么怎么解决呢,其实很简单,负数加负数其实就等于两者的正数相加,然后符号位强制为负号。

也就是说,(- 2 ) + (- 3)= (-)(2 + 3)= - 5

既然2+3不会出错,那么(-)(2 + 3)就不会出错,那么(- 2 )+(- 3 )也就不会出错了。

其实反码已经解决了减法的问题,而且加法的运算原码也能完成。既然如此,那我们课程中学习的补码又有什么用呢?
其实补码才是最难理解的,下面听我细说。

补码

前言

说补码,我不想先说补码的定义或者是算法。还是这道题
7 - 3 = ?(均为十进制)
对于计算机来说,除了计算相反数就没有别的办法了吗?
有的,不知道各位有没有留意到我们最常见的时钟,我们将这道问题转换为一个时钟。请添加图片描述
就像我们日常生活中解决减法问题一样
请添加图片描述

理解了这个再来理解补码就容易得多了。

定义

补码:正数的补码等于它的原码,负数的补码等于反码加一

其实书上也就这句话告诉我们补码怎么计算。我们也不知道为什么负数的补码等于反码加一。而且科学家也不可能随随便便将反码加一定义为补码。只不过补码就正好等于反码加一。接下来我来细致的讲讲负数的补码为什么等于反码加一。

在这里,我们模仿一下计算机对数据运算的过程!

请添加图片描述
这是计算机根据这种思想完成的运算。

如果根据补码计算
请添加图片描述
接下来我们根据教材上教给我们的办法完成
对-3的补码运算:
-3的原码为 1011
-3的反码为 1100
-3的补码为 1101

与我们再上上一张图片中计算得到的0101只有符号位有差别。但我在上上一张图中得到的是一个正数(与-3同余的正数)而我们只需要更改一下符号位便可以得到-3的补码。
接下来我将通过几组数据来验证一下我的猜想:
请添加图片描述

原码反码补码的本质

原码:

原码便于解决两个正数或者两个负数相加的问题,类似于计算机中的加法运算器。

反码和补码:

反码和补码都便于解决正数和正数相减的问题,但两者解决的方式不同。

以正数A减去正数B等于C为例(均为十进制)

反码解决方式
1.首先将减法问题转换为加法问题。
A - B = A + (- B)其中 -B 为B的相反数
2.然后将A的反码加上-B的反码此时得到C的反码
3.将C的反码转换为原码得到C

补码解决方式
1.首先将减法问题转换为加法问题
2.计算机找到一个整数与B同余
3.将计算结果取模

  • 9
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

R丿清风不解语

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

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

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

打赏作者

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

抵扣说明:

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

余额充值