前言
hmm,简单介绍一下二进制数的原码、反码和补码。
(●'◡'●)嘻嘻,稍微水一篇
正文
1. 简介
首先简单介绍一下原码、反码和补码的各自是什么吧
- 原码就是二进制实际的数值
- 反码就是对原码取反
- 补码就是对原码取反后再加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.