二进制原码、反码、补码

理解计算机中整数的三种表示方法

1. 基本概念

在计算机中,整数可以用三种不同的二进制表示方式:原码、反码、补码。现代计算机主要使用补码来表示有符号整数。

关键要点:
  • 最高位是符号位:0 表示正数,1 表示负数
  • 正数的原码、反码、补码都相同
  • 负数的三种表示方式不同

2. 原码

定义

原码是最直观的表示方法,最高位为符号位,其余位表示数值的绝对值。

[+X]原 = 0 + X
[-X]原 = 1 + X

示例(8位)

原码的问题:
  • 0 有两种表示:+0 = 00000000,-0 = 10000000
  • 加减法运算复杂,需要先判断符号位
  • 不能直接进行算术运算

3. 反码

定义

反码是为了解决原码的问题而提出的:

[+X]反 = [+X]原
[-X]反 = [-X]原 符号位不变,数值位取反

示例(8位)

反码的问题:
  • 0 仍然有两种表示:+0 = 00000000,-0 = 11111111
  • 减法运算仍然需要特殊处理进位

4. 补码

定义

补码是现代计算机采用的表示方法,完美解决了前面的问题:

[+X]补 = [+X]原 = [+X]反
[-X]补 = [-X]反 + 1

示例(8位)

补码的优势:
  • 0 只有唯一的表示:00000000
  • 符号位可以直接参与运算
  • 减法可以用加法实现,简化硬件设计
  • 表示范围更大:n 位补码可表示 -2n-1 到 2n-1-1

5. 三种表示方式对比

十进制 原码(8位) 反码(8位) 补码(8位)
+127 01111111 01111111 01111111
+1 00000001 00000001 00000001
+0 00000000 00000000 00000000
-0 10000000 11111111 00000000
-1 10000001 11111110 11111111
-5 10000101 11111010 11111011
-128 无法表示 无法表示 10000000

6. 计算演示

请输入数字并点击"计算"按钮

7. 补码转原码

将补码转换回原码,只需要重复上述过程:

步骤:
  1. 如果补码是正数(符号位为0),直接就是原码
  2. 如果补码是负数(符号位为1):
    • 先减 1
    • 再取反(符号位不变)

示例:补码 11111011 → 原码

8. 为什么使用补码?

数学原理:模运算

在 n 位系统中,补码的本质是模 2n 的剩余系。

例如,8位系统模 256:

  • -5 的补码 = 256 - 5 = 251 = 111110112
  • -1 的补码 = 256 - 1 = 255 = 111111112

减法转加法

5 - 3 = 5 + (-3)补 = 00000101 + 11111101 = 00000010 (mod 256)
结果:00000010 = 2 ✓
// C++ 中验证
#include 
using namespace std;

int main() {
    unsigned char a = 5;    // 00000101
    unsigned char b = -3;  // 11111101 (-3的补码)
    cout << (int)(a + b) << endl;  // 输出: 2
    return 0;
}