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

来自姬鸿昌的知识库
跳到导航 跳到搜索
(建立内容为“因为取补码可以简化二进制加减法运算。 假如我们不使用补码,以4个字节的 int 为例,第1位是符号位,0代表正数,1代码…”的新页面)
 
 
(未显示同一用户的2个中间版本)
第1行: 第1行:
 +
https://www.bilibili.com/video/BV1F741137za
 +
 
因为取补码可以简化二进制加减法运算。
 
因为取补码可以简化二进制加减法运算。
 
  
 
假如我们不使用补码,以4个字节的 int 为例,第1位是符号位,0代表正数,1代码负数
 
假如我们不使用补码,以4个字节的 int 为例,第1位是符号位,0代表正数,1代码负数
第15行: 第16行:
 
|-
 
|-
 
| colspan="2" | -2就是:
 
| colspan="2" | -2就是:
|1000 0000  0000 0000  0000 0000 0000 0001
+
|1000 0000  0000 0000  0000 0000 0000 0010
 +
|}
 +
-2+1应该等于-1,这个时候我们发现:
 +
{| class="wikitable"
 +
|
 +
|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
 +
|}
 +
这并不符合我们的期待。
 +
 
 +
 
 +
 
 +
相反,如果我们应用补码:
 +
{| class="wikitable"
 +
| +1是:
 +
|0000 0000  0000 0000  0000 0000 0000 0001
 +
|-
 +
|求-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
 +
| -1
 
|}
 
|}
-2+1应该等于-1,这个时候我们发现
+
得到了我们期待的答案,不需要再判断正、负数,直接就可以做加、减法运算了

2022年9月3日 (六) 10:46的最新版本

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

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