https://www.bilibili.com/video/BV1F741137za
因为取补码可以简化二进制加减法运算。
假如我们不使用补码,以4个字节的 int 为例,第1位是符号位,0代表正数,1代码负数
| +1是:
|
0000 0000 0000 0000 0000 0000 0000 0001
|
| -1就是:
|
1000 0000 0000 0000 0000 0000 0000 0001
|
| +2是:
|
0000 0000 0000 0000 0000 0000 0000 0010
|
| -2就是:
|
1000 0000 0000 0000 0000 0000 0000 0010
|
-2+1应该等于-1,这个时候我们发现:
|
|
1000 0000 0000 0000 0000 0000 0000 0010
|
-2
|
| +
|
0000 0000 0000 0000 0000 0000 0000 0001
|
+1
|
| =
|
1000 0000 0000 0000 0000 0000 0000 0011
|
-3
|
这并不符合我们的期待。
相反,如果我们应用补码:
| +1是:
|
0000 0000 0000 0000 0000 0000 0000 0001
|
| 求-1的补码形式,先求反码_负数符号位是1,其余位按位取反:
|
1111 1111 1111 1111 1111 1111 1111 1110
|
| -1的补码,在反码的基础上+1
|
1111 1111 1111 1111 1111 1111 1111 1111
|
| +2是:
|
0000 0000 0000 0000 0000 0000 0000 0010
|
| 求-2的补码形式,先求反码_负数符号位是1,其余位按位取反:
|
1111 1111 1111 1111 1111 1111 1111 1101
|
| -2的补码,在反码的基础上+1
|
1111 1111 1111 1111 1111 1111 1111 1110
|
-2+1就是
|
|
1111 1111 1111 1111 1111 1111 1111 1110
|
-2
|
| +
|
0000 0000 0000 0000 0000 0000 0000 0001
|
+1
|
| =
|
1111 1111 1111 1111 1111 1111 1111 1111
|
-1
|
得到了我们期待的答案,不需要再判断正、负数,直接就可以做加、减法运算了