前言

hmm,简单介绍一下二进制数的原码、反码和补码。
(●'◡'●)嘻嘻,稍微水一篇

正文

1. 简介

首先简单介绍一下原码、反码和补码的各自是什么吧

  1. 原码就是二进制实际的数值
  2. 反码就是对原码取反
  3. 补码就是对原码取反后再加1(00000001)

2. 算法

2.1 原码

定义:二进制的值,么得算法。

2.2 反码

定义:对原码每个位取反。

2.3 补码

定义:对原码每个位取反(对原码取反码),后加1。

3. 为什么补码?

之所以引入补码,首先最重要的就是为了让符号位一起参与进运算,如为什么会有原码、反码和补码?所举的两个例子,两个例子中我们在例子1.1中用原码进行计算5-2,在例子1.2中我们用反码进行计算5-2,在例子1.3中我们用补码进行5-3

例子1.1:A=0101(5) B=1010(-2),求A+B=? (由于CPU中没有时间减法电路,所以我们所有的减法都是通过对减数取反来实现的)

  0101
+1010
——————
  1111

结果为1111(-7),很明显结果不太对。除此之外,我们很容易的发现,除了这个所谓的-7。在这种情况下,我们还会出现0000(+0)和1000(-0)两种情况。

例子1.2:A=0101(5) B=1101(-2),求A+B=?

  0101
+1101
——————
  10010

结果为0010(2),显然结果也不太对。与例子1.1相同的是,反码也会出现0000(+0)和1111(-0)两种情况。

例子1.3:A=0101(5) B=1110(-2),求A+B=?

  0101
+1110
——————
  10011

结果为0011(3),我们发现结果对了!我们也惊奇的发现,在使用补码的时候,我们只有一个0000(0),因为1111我们可以对其取反码+1,得到其取反为0001(1),所以1111(-1)表示的是-1。

其实对于补码来说他的符号位也是有具体的数值的也就是-2(n-1)(n为符号位所在的位),所以1111其实是-23+22+21+20=-8+4+2+1=-1。

所以,综上所述,在计算机中,我们对原码取反,其实就是算其补码。

总结

在计算机中,我们对原码取反,其实就是算其补码。(嘻嘻,我好懒O(∩_∩)O,就酱紫!)

参考

[1] 负数求补码
[2] -1的源码、反码、补码
[3] -1的原码、反码、补码(0xff)
[4] 为什么会有原码、反码和补码?

Q.E.D.


立志做一个有趣的碳水化合物