“为什么负数在计算机中要用补码表示”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
第20行: 第20行:
 
|
 
|
 
|1000 0000  0000 0000  0000 0000 0000 0010
 
|1000 0000  0000 0000  0000 0000 0000 0010
|(-2)
+
| -2
 
|-
 
|-
 
| +
 
| +
 
|0000 0000  0000 0000  0000 0000 0000 0001
 
|0000 0000  0000 0000  0000 0000 0000 0001
|(+1)
+
| +1
 
|-
 
|-
 
|=
 
|=
 
|1000 0000  0000 0000  0000 0000 0000 0011
 
|1000 0000  0000 0000  0000 0000 0000 0011
|(-3)
+
| -3
 
|}
 
|}
 
这并不符合我们的期待。
 
这并不符合我们的期待。
第39行: 第39行:
 
|0000 0000  0000 0000  0000 0000 0000 0001
 
|0000 0000  0000 0000  0000 0000 0000 0001
 
|-
 
|-
| -1就是:
+
|-1的补码形式,先求'''<big>反码</big>'''_负数符号位是1,其余位按位取反:
 +
|1111 1111  1111 1111  1111 1111 1111 1110
 +
|-
 +
|  -1的补码,在反码的基础上+1
 +
|1111 1111  1111 1111  1111 1111 1111 1111
 +
|}
 +
{| class="wikitable"
 +
| +2是:
 +
|0000 0000  0000 0000  0000 0000 0000 0010
 +
|-
 +
|求-2的补码形式,先求'''<big>反码</big>'''_负数符号位是1,其余位按位取反:
 +
|1111 1111  1111 1111  1111 1111 1111 1101
 +
|-
 +
| -2的补码,在反码的基础上+1
 +
|1111 1111  1111 1111  1111 1111 1111 1110
 +
|}
 +
-2+1就是
 +
{| class="wikitable"
 +
|
 +
|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
 
|1111 1111  1111 1111  1111 1111 1111 1111
 +
| -1
 
|}
 
|}
 +
得到了我们期待的答案,不需要再判断正、负数,直接就可以做加、减法运算了

2022年9月3日 (六) 10:39的版本

因为取补码可以简化二进制加减法运算。

假如我们不使用补码,以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

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