补码(two's complement,二的补码)是现代计算机表示有符号整数的标准方式。下面重点说明生成方法。
补码如何批量得到结果
生成补码:正数直接写二进制;负数用 2^w-|n|,或对绝对值取反加 1。语言中通常直接写整数字面量,由编译器按补码存储。
n = -42
print(format(n & 0xFF, "08b")) # 8 位补码 11010110
print(int("11010110", 2) - 256) # 回到 -42(最高位为 1 时减 256)
示例
输入:8
补码结果:8 位补码 00001000(十进制校验:8)
说明:正数补码等于原码;负数补码等于反码加 1,8 位补码可表示 -128。
注意事项
- 看内存或十六进制时,最高位为 1 的值要用补码规则还原,不能当原码读
- 有符号右移与无符号右移结果不同
- 整数溢出在 C 等语言中可能是未定义行为或静默回绕
- Python 的 int 不回绕,要用模运算或 ctypes/c_int8 才能模拟固定位宽
命令行示例
# 查看 -42 的 8 位补码
python3 -c "print(format((-42) & 0xFF, '08b'))"
# 从补码还原
python3 -c "x=0b11010110; print(x-256 if x>=128 else x)"
本站的进制转换工具可以直接处理,计算在浏览器本地完成,适合快速核对结果。
常见问题
【为什么 11111111 是 -1 不是 -127?】按补码还原:取反得 00000000,加 1 得 1,再加负号为 -1。读成原码才会得到 -127。
【Java 的 byte 范围为什么是 -128~127?】byte 是 8 位补码,正好是这个范围。
【如何把补码转回十进制?】最高位为 0 按正数读;为 1 时,无符号值减去 2^w。11010110=214,214-256=-42。
文中示例可以在本站对应工具中验证;处理密钥、证书等敏感数据时,请注意保护隐私。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。