为什么负数在计算机中要用补码表示

来自姬鸿昌的知识库
跳到导航 跳到搜索

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

得到了我们期待的答案,不需要再判断正、负数,直接就可以做加、减法运算了