带符号的二进制数的加减法通常使用补码(Two's Complement)表示法来进行计算. 补码表示法可以简化加法和减法的操作, 并且能够统一处理正数和负数.

补码表示法

  • 正数:补码与原码相同.
  • 负数:补码是其绝对值的二进制表示取反后加1.

例如:

  • 正数 +5 的8位二进制表示为 00000101.
  • 负数 -5 的8位二进制表示为 1111101100000101 取反后加1).

加法

带符号的二进制数加法与无符号二进制数加法类似, 直接按位相加即可. 如果结果超出表示范围(溢出), 则结果不正确.

示例

  00000101  (+5)
+ 11111011  (-5)
-----------
 100000000  (0)

结果 100000000 超出了8位表示范围, 最高位的 1 被丢弃, 最终结果为 00000000, 即 0.

减法

减法可以通过将减数取补码后与被减数相加来实现.

示例: 计算 7 - 5

  1. 5 的补码为 00000101.
  2. -5 的补码为 11111011.
  3. 7-5 相加:
  00000111  (+7)
+ 11111011  (-5)
-----------
 100000010  (+2)

最高位的 1 被丢弃, 最终结果为 00000010, 即 +2.

溢出检测

在进行带符号的二进制数加减法时, 可能会发生溢出. 溢出可以通过以下规则检测:

  • 加法溢出:如果两个正数相加结果为负数, 或者两个负数相加结果为正数, 则发生溢出.
  • 减法溢出:如果正数减负数结果为负数, 或者负数减正数结果为正数, 则发生溢出.

示例: 计算 127 + 1(8位表示):

  01111111  (+127)
+ 00000001  (+1)
-----------
  10000000  (-128)

结果 10000000 表示 -128, 发生了溢出.

总结

  • 带符号的二进制数加减法使用补码表示法.
  • 加法直接相加, 减法通过加补码实现.
  • 注意溢出检测, 确保结果正确.