目录
一.何为原码反码和补码?
(1)原码
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
- 符号位:最高位(最左边的位)用于表示符号,
0
表示正数,1
表示负数。 - 数值部分:其余的位用于表示数值的绝对值。
例如,在 8 位二进制中:
- +5 表示为:
0000 0101(最左边的0表示正数)
- -5 表示为:
1000 0101(最右边的1表示负数)
(2)反码
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
- 正数:反码和原码一样。
- 负数:反码为原码的按位取反。
例如,在 8 位二进制中:
- +5 的反码:
0000 0101
(与原码相同) - -5 的反码:
1111 1010
(将原码的数值部分按位取反)
(3)补码
补码:反码+1就得到补码。
- 正数:补码与原码相同。
- 负数:负数的补码为反码加 1。
例如,在 8 位二进制中:
- +5 的补码:
0000 0101
(与原码相同) - -5 的补码:
1111 1011
(反码1111 1010
+ 1 =1111 1011
)
(4)总结
数值 | 原码 | 反码 | 补码 |
+5 | 0000 0101 | 0000 0101 | 0000 0101 |
-5 | 1000 0101 | 1111 1010 | 1111 1011 |
+0 | 0000 0000 | 0000 0000 | 0000 0000 |
-0 | 1000 0000 | 1111 1111 | 0000 0000 |
二.原反补之间的简单计算
(1)补码加法
补码的加法与普通的二进制加法相同,不区分正负数。无论是正数加正数、正数加负数,还是负数加负数,计算机只需将它们的补码相加,溢出的位自动丢弃。
例子:
例子 1:正数加法
计算 5 + 3
,用 8 位补码表示:
- 5 的补码是:
0000 0101
- 3 的补码是:
0000 0011
0000 0101
+ 0000 0011
------------
0000 1000 (结果为 8,正确)
例子 2:正数加负数
计算 5 + (-3)
,用 8 位补码表示:
- 5 的补码是:
0000 0101
- -3 的补码是:
1111 1101(
原码是0000 0011)(3 的反码1111 1100
加 1)
0000 0101
+ 1111 1101
------------
0000 0010 (结果为 2,正确)
溢出的位被自动丢弃,所以结果保持正确。
(2) 补码减法
减法可以通过将减数的补码取反(即变成负数),然后与被减数相加来实现。因此,减法实际上也是通过加法来处理的。
例子 3:正数减法计算 5 - 3
,相当于 5 + (-3)
,用 8 位补码表示:
- 5 的补码是:
0000 0101
- -3 的补码是:
1111 1101
0000 0101
+ 1111 1101
------------
0000 0010 (结果为 2,正确)
例子 4:负数减负数
计算 -5 - (-3)
,相当于 -5 + 3
,用 8 位补码表示:
- -5 的补码是:
1111 1011
- 3 的补码是:
0000 0011
1111 1011
+ 0000 0011
------------
1111 1110 (结果为 -126,正确)
看上面3个例子结果都是对的,为什么到这里结果就不是-2了呢?
这是因为正数他的原反补都是相同的,我们一般都是用补码来计算两个数的相加或相减,然后再将计算出来的结果转换为原码,最后计算出最终结果,我们前面三个例子计算出来的都是正数,原反补都一样,所以是正确的。
至于这第四个例子,负数得先转换原码,我在这里教大家一个快速计算由补码转换为原码的方法:
从最右边开始找,找到第一个1,然后在他的前一位加1就可以得到原码
对于本题:
1111 1110
+ 1
-------------
10000 0010(显然是-2)
补充:由于计算机中采用补码表示法进行加法运算时,可以将有符号整数的加法统一为无符号整数的加法,并且如果最高位(符号位)有进位,则忽略该进位。因此,我们可以直接进行二进制加法运算而不考虑符号位的进位。
(3) 溢出问题
在使用补码进行加减法时,可能会出现 溢出。溢出是指结果超出了可表示的范围。例如,8 位补码可以表示 -128 到 127 的数值,超过这个范围的结果会出现错误。
例子 5:溢出
计算 120 + 10
,用 8 位补码表示:
- 120 的补码是:
0111 1000
- 10 的补码是:
0000 1010
0111 1000
+ 0000 1010
------------
1000 0010 (结果为 -126,溢出)
解释:因为 8 位补码最大能表示的数是 127,但实际结果 130
超出了范围,导致溢出并得到一个错误的结果(-126)。