二进制有符号数的计算涉及原码、反码和补码的转换与运算规则,以下是关键要点:
一、符号位的表示
最高位为符号位 - `0` 表示正数
- `1` 表示负数
其余位为数值位,表示数值大小。
原码、反码、补码
- 原码: 直接按位表示,符号位不变,数值位不变(正数与反码相同)。 - 反码
- 补码:反码加1,符号位不变。
二、基本运算规则
加法运算 - 正数与正数相加:直接按位相加,不考虑符号位。
- 负数与负数相加:按位相加后判断是否溢出。若结果超出表示范围(如两个-80相加超过-128),则发生溢出,结果会错误地显示为正数。
- 正数与负数相加:需考虑补码形式,实际是正数减负数的补码。
减法运算
- 正数减负数:相当于正数加负数的补码。
- 负数减正数:需考虑补码形式,实际是负数加正数的补码。
三、溢出判断
加法溢出: 同号数相加:若次高位(数值位最高位)产生进位,但符号位无进位(如两个正数相加结果为负数)。 异号数相加:若次高位无进位,但符号位有进位(如两个负数相加结果为正数)。 减法溢出
正数减负数:若次高位不需借位,但符号位需借位(如1001 - 0001结果为1000,符号位从0变1)。
负数减正数:若次高位需借位,但符号位不需借位(如1001 - 1001结果为0,符号位从1变0)。
四、示例说明
计算 `(-72) + 98`:
1. 转换为补码:
- -72的补码为 `10010100`(8位表示)
- 98的补码为 `01100010`
2. 按位相加:
```
10010100
+ 01100010
10000110
```
3. 结果分析:
- 次高位(第7位)产生进位,但符号位(第8位)无进位,符合溢出条件,结果应为负数。 - 实际结果 `-86` 的补码为 `10001010`,与计算结果一致。
五、注意事项
计算机内部统一以补码形式存储和运算,程序设计时需注意数据类型和溢出处理。
逻辑运算(与、或、异或)直接按位操作,与算术运算不同。
通过以上规则,可正确处理二进制有符号数的加减运算,并避免溢出错误。