“为什么负数在计算机中要用补码表示”的版本间的差异
		
		
		
		
		
		跳到导航
		跳到搜索
		
				
		
		
	
| Jihongchang(讨论 | 贡献) | Jihongchang(讨论 | 贡献)  | ||
| (未显示同一用户的1个中间版本) | |||
| 第1行: | 第1行: | ||
| + | https://www.bilibili.com/video/BV1F741137za | ||
| + | |||
| 因为取补码可以简化二进制加减法运算。 | 因为取补码可以简化二进制加减法运算。 | ||
| 第20行: | 第22行: | ||
| | | | | ||
| |1000 0000   0000 0000  0000 0000 0000 0010 | |1000 0000   0000 0000  0000 0000 0000 0010 | ||
| − | | | + | | -2 | 
| |- | |- | ||
| | + | | + | ||
| |0000 0000   0000 0000  0000 0000 0000 0001 | |0000 0000   0000 0000  0000 0000 0000 0001 | ||
| − | | | + | | +1 | 
| |- | |- | ||
| |= | |= | ||
| |1000 0000   0000 0000  0000 0000 0000 0011 | |1000 0000   0000 0000  0000 0000 0000 0011 | ||
| − | | | + | | -3 | 
| |} | |} | ||
| 这并不符合我们的期待。 | 这并不符合我们的期待。 | ||
| 第39行: | 第41行: | ||
| |0000 0000   0000 0000  0000 0000 0000 0001 | |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 | |1111 1111   1111 1111  1111 1111 1111 1111 | ||
| + | | -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 | 
得到了我们期待的答案,不需要再判断正、负数,直接就可以做加、减法运算了