原码是一种计算机中对数字的二进制定点表示法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为 0,负数该位为 1(0 有两种表示:+0 和 -0),其余位表示数值的大小。举个例子,我们用 8 位二进制表示一个数,+12
的原码为 00001100
,-12
的原码就是 10001100
。
一个数字用原码表示是容易理解的,但是需要单独一个位来表示符号位,并且在进行加法时,计算机需要先识别某个二进制原码是正数还是负数,识别出来之后再进行相应的运算。这样效率不高,能不能让计算机在进行运算时不用去管符号位,也就是让符号位参与运算。要实现这个功能,我们就要用到反码。
反码是一种在计算机中数的机器码表示。对于单个数值(二进制的 0 和 1)而言,对其进行取反操作就是将 0 变为 1,1 变为 0。
例如:
十进制 | 原码 | 反码 |
---|---|---|
6 | 0000 0110 | 0000 0110 |
-3 | 1000 0011 | 1111 1100 |
6-3
6 - 3 ==> 6 + (-3)
0000 0110 // 6(反码)
+ 1111 1100 // -3(反码)
----------------------
0000 0010 // (反码)
0000 0010 // 2(原码)
显然计算错误
1-1
1 - 1 ==> 1 + (-1)
0000 0001 // 1(反码)
+ 1111 1110 // -1(反码)
----------------------
1111 1111 // (反码)
1000 0000 // -0(原码)
由上可知 1 + (-1)
的运算结果为 -0
,而我们预期的值是 +0
。
0 + 0
0 + 0 ==> 0 + 0
0000 0000 // 0(反码)
+ 0000 0000 // 0(反码)
----------------------
0000 0000 // (反码)
0000 0000 // 0(原码)
这里我们可以知道 -0
对应的原码是 1000 0000
,而 +0
对应的原码是 0000 0000
。虽然 -0
和 +0
代表的数值是一样的,但是在用原码和反码表示时它们是不同的。通过以上的多个示例,我们发现使用反码进行加法运算并不能保证得出正确的结果。原因是用一个字节表示数字的取值范围时,这些数字中多了一个 -0
。为了解决反码出现的问题,就出现了补码。
补码是一种用二进制表示有符号数的方法。
十进制 | 原码 | 反码 | 补码 |
---|---|---|---|
6 | 0000 0110 | 0000 0110 | 0000 0110 |
-3 | 1000 0011 | 1111 1100 | 1111 1101 |
6 - 3 ==> 6 + (-3)
0000 0110 // 6(补码)
+ 1111 1101 // -3(补码)
----------------------
0000 0011 // 3(补码)
1 - 1 ==> 1 + (-1)
0000 0001 // 1(补码)
+ 1111 1111 // -1(补码)
----------------------
0000 0000 // 0(补码)
原文地址:https://www.cnblogs.com/lsyy2020/p/14853955.html