You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用补码表示法计算负数减负数?含反码运算相关疑问

二进制反码/补码减法运算规则梳理

核心前提(解决90%混淆的根本)

所有二进制串的数值解读、运算规则,都必须先约定两个固定前提,不存在脱离前提的模糊解读:

  1. 运算采用的位宽:比如4位、8位、16位,只有当前位宽下的最左侧位,才有可能是符号位
  2. 运算采用的编码规则:无符号数、原码、反码(One's Complement)、补码(Two's Complement)

只要约定为有符号数编码(原/反/补码),当前位宽的最高位就是符号位,0代表正、1代表负;只要约定为无符号数编码,所有位都是普通数值位,没有符号位。约定完成后每个二进制串对应的真值是唯一的,不存在随机切换解读的可能。


问题1:0101 - 1100的解读规则

以最常见的4位位宽场景为例,两种约定下的解读完全固定:

  • 若约定为4位无符号数运算:没有符号位,0101对应真值5,1100对应权值计算结果12,式子永远解读为5 - 12。4位无符号数表示范围是0~15,该运算结果为-7,超出表示范围,硬件会按模16得到结果1001(即无符号数9)。
  • 若约定为4位有符号补码运算:最高位为符号位,0101是正数+5,1100是负数-4,式子解读为5 - (-4)。4位补码表示范围是-8~+7,结果9超出正向上限,会产生正溢出,得到无效结果1001(对应补码-7),需要将位宽拓宽到5位及以上才能得到正确结果9。
  • 若约定为4位有符号反码运算:1100对应负数-3,式子解读为5 - (-3),结果8超出4位反码-7~+7的表示范围,同样会溢出,需拓宽位宽计算。

问题2:用反码计算0101 - 1100的方法

反码完全可以实现减法运算,核心运算规则只有一条:所有减法统一转换为加法,即A - B = A的反码 + (-B)的反码,符号位和数值位一起参与运算;如果相加后最高位产生了进位,要把这个进位加到结果的最低位(即循环进位规则)。
不存在计算时临时选择解读方式的说法,你在运算前约定好编码规则,按规则转换真值计算即可:

  1. 如果你要计算的是无符号场景下的5 - 12:
    4位反码的表示范围只有-7~+7,无法容纳-12,需要将位宽拓宽到5位:
    • +5的5位反码为00101,-12的5位反码为10011(符号位为1,数值位为12的原码按位取反)
    • 两数相加:00101 + 10011 = 11000,最高位无进位,不需要处理循环进位
    • 结果最高位为1,是负数,数值位按位取反得到绝对值7,最终结果为-7,和数学计算一致。
  2. 如果你约定是4位有符号反码场景,即计算5 - (-3):
    4位反码无法容纳结果8,同样拓宽到5位计算:
    • +5的5位反码为00101,+3的5位反码为00011
    • 两数相加:00101 + 00011 = 01000,最高位无进位,结果为+8,计算正确。

问题3:被减数为负数的减法计算(以-5 -7为例)

反码计算流程

反码运算不需要死记“对哪个数取反”,只要按照“减法转加法、所有数转反码、相加、处理循环进位”的流程走即可,以5位位宽(可覆盖-16~+15范围,足够容纳结果-12)为例:

  1. 把算式转成加法形式:-5 - 7 = -5 + (-7)
  2. 将两个加数都转成5位反码:
    • -5的原码为10101,反码保留符号位、数值位取反,得到11010
    • -7的原码为10111,反码为11000
  3. 两数相加:11010 + 11000 = 110010,注意5位运算下相加得到了6位结果,最高位的1就是进位
  4. 按循环进位规则,把进位的1加到低5位结果的最低位:低5位是10010,加1后得到10011
  5. 结果最高位为1是负数,数值位取反得到绝对值12,最终结果为-12,计算正确。

补码计算流程

补码运算逻辑和反码类似,差异只有两点:一是负数的补码是反码加1,二是最高位产生的进位直接丢弃,不需要处理循环进位。同样用5位位宽计算:

  1. 算式转加法:-5 + (-7)
  2. 转5位补码:
    • -5的反码是11010,补码加1得到11011
    • -7的反码是11000,补码加1得到11001
  3. 两数相加:11011 + 11001 = 110100
  4. 直接丢弃最高位产生的进位1,取低5位得到10100
  5. 验证结果:10100最高位为1是负数,取反加1得到绝对值12,对应真值-12,计算正确。

易混点总结

  • 永远不要在没有指定位宽和编码规则的前提下,判断一个二进制串是正还是负、值是多少
  • 反码和补码的减法都不需要特殊记忆“谁取补”,只要把所有减法转成“加负数”,再把数转成对应编码直接相加即可
  • 反码必须处理循环进位,补码直接丢弃进位,这是两者运算流程的核心差异

内容的提问来源于stack exchange,提问作者newbie1kenobi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:21:34