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

带正负号的十进制与二进制互转问题:二进制转十进制不支持负数

8位二进制补码转十进制负数的解决方案

你的问题出在Python的int()函数默认将二进制数视为无符号整数,因此会把补码10011100直接计算为156,而没有识别这是8位有符号补码表示的负数。

核心解决思路

对于固定位宽(如8位)的补码:

  • 如果最高位是1,说明这是负数的补码,需要通过(2^位宽) - 无符号值得到负数的绝对值,再加负号
  • 如果最高位是0,直接按无符号整数转换即可

实现代码

下面是针对8位补码的转换函数,同时兼容正数和负数:

def twos_comp_to_decimal(bin_str, bit_width=8):
    # 确保二进制字符串长度符合指定位宽,不足补零,过长则取最后bit_width位
    bin_str = bin_str.zfill(bit_width)[-bit_width:]
    if bin_str[0] == '1':
        # 补码转负数:计算无符号值后,用 2^bit_width 减去该值得到绝对值,取负
        unsigned_val = int(bin_str, 2)
        return -( (1 << bit_width) - unsigned_val )
    else:
        return int(bin_str, 2)

# 测试你的示例
binary_str = "10011100"
print(twos_comp_to_decimal(binary_str))  # 输出: -100

# 测试正数补码
print(twos_comp_to_decimal("01100100"))  # 输出: 100

适配你原有代码的写法

如果你坚持使用整数形式的二进制输入(如10011100),可以先将其转为字符串再处理:

binary = 10011100
binary_str = str(binary)
print(twos_comp_to_decimal(binary_str))  # 输出: -100

更简洁的位运算实现

也可以通过判断无符号值是否超过位宽允许的最大正数,直接调整得到负数:

def twos_comp_to_decimal_simple(bin_str, bit_width=8):
    val = int(bin_str, 2)
    max_positive = (1 << (bit_width - 1)) - 1
    if val > max_positive:
        val -= (1 << bit_width)
    return val

print(twos_comp_to_decimal_simple("10011100"))  # 输出: -100

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:45:33