补码(two's complement,二的补码)是现代计算机表示有符号整数的标准方式。下面重点说明适用与不适用。
补码的优点和限制
实际开发一律按补码理解和计算;教材中的原码、反码只用于对照原理。
补码与原码、反码的关键差别是“只有一个零”和“可以直接做加减法”。-1 在补码中是全 1,在原码中是 10000001。补码还能表示比原码多一个负数(8 位的 -128)。
示例
输入:100
补码结果:8 位补码 01100100(十进制校验:100)
说明:正数补码等于原码;负数补码等于反码加 1,8 位补码可表示 -128。
工作原理
求 -n 的补码:先写出 n 的原码,按位取反再加 1。例如 -42:42=00101010,取反 11010101,加 1 得 11010110。还原:若最高位为 1,再取反加 1 得到绝对值。也可直接用“模 2^w 的余数”理解:-42 的 8 位补码就是 256-42=214=11010110。
乱码排查
把补码当原码读是最常见的误解:11111111 会被读成 -127,实际是 -1。协议文档应写明 signed 使用 two's complement。
本站的进制转换工具可以直接处理,计算在浏览器本地完成,适合快速核对结果。
常见问题
【Java 的 byte 范围为什么是 -128~127?】byte 是 8 位补码,正好是这个范围。
【如何把补码转回十进制?】最高位为 0 按正数读;为 1 时,无符号值减去 2^w。11010110=214,214-256=-42。
【-1 的 8 位补码是什么?】11111111。这是最常见的记忆点:全 1 就是 -1。
文中示例可以在本站对应工具中验证;处理密钥、证书等敏感数据时,请注意保护隐私。