原码,反码,补码

发布时间 2023-09-20 19:36:35作者: 不柴

原码

原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负。

利用原码对正数进行计算是不会有问题的。

原码的弊端

利用原码对负数进行计算时,结果就会出错,最终的计算结果,和我们的预期结果是相反的。

比如:

一个字节,用1和-1来计算

  • 正数计算,1的原码为:0000 0001

    进行+1,结果为:0000 0010

    等于2,没有任何问题。

  • 负数计算,-1的原码为:1000 0001

    进行+1,结果为,1000 0010

    等于-2,与我们预期的结果相反。

可以看见,原码对负数进行计算,会出现错误的结果。

原码为什么会有这样的弊端?

我们可以用一个数轴来理解。

image

原码对正数进行计算时,对正数加1,我们是往数轴的正方向行走,那么1+1=2,没有任何问题。

image

当我们用原码对负数进行计算时,因为原码的符号位为1,即为负数,而+1的操作,会使我们往数轴的负方向行走,1+1=2,但添上负号,就变成了-2。出现了错误答案。

为了解决这个问题,人们就发明了反码。

反码

反码:为了解决原码不能计算负数的问题而出现。

计算规则:正数的反码不变,负数的反码在原码的基础上,符号位不变,数值取反,0变1,1变0。

比如:

  • -6的原码为:1000 0110
  • -6的反码为:0111 1001

我们利用-6的反码进行+1计算

  • 0111 1001 + 1 = 0111 1010

    再将反码转换为原码:1000 0101

    结果为-5,答案正确

利用反码,我们就可以解决原码不能对负数进行计算的弊端。

但是,反码也存在一个弊端

反码的弊端

为了清楚的看到反码的弊端,我制作了一个表格

image

  • 我们利用反码对负数进行计算,当对-1进行加2操作的时候

    -1加2(反码):1111 1110 + 0000 0010 =1 0000 0000

    由于是一个字节,多的1我们不要

    结果为:0000 0000

    转换为原码:0000 0000 = 0

-1加2,不应该等于1吗?很明显,答案有出错了。

这是因为,反码中存在两个0。

一个正数0,编码为:0000 0000

一个负数0,编码为:1000 0000

为了解决这个问题,人们发明了补码

补码

同样,我制作了一个表格

image

对于正数,原码,反码,补码,都是一样的。

对于负数:

  • 反码:符号位不变,其它按位取反,0变1,1变0。

  • 补码:在反码的基础上,进行+1操作。

    体现在表格中,就是整体向下移动了一位。

同样,我们利用补码对-1进行加2操作

  • -1的补码:1111 1111

    -1加2:1111 1111 + 0000 0010 = 1 0000 0001

    由于一个字节的限定,去掉左边的1,编码位:0000 0001 = 1

这时,就不会出现反码的弊端了。

可以说,补码完美解决了原码和反码的弊端,可以对正数和负数进行计算。

所以,在计算机中数字的存储还有运算,都是以补码的形式来进行的。

补码的细节

image

由图可见,-128没有原码和反码,但是有补码:1000 0000

有人可能疑惑,最左边位符号位,1000 0000应该是0才对。