1. 基本概念
在计算机中,整数可以用三种不同的二进制表示方式:原码、反码、补码。现代计算机主要使用补码来表示有符号整数。
关键要点:
- 最高位是符号位:0 表示正数,1 表示负数
- 正数的原码、反码、补码都相同
- 负数的三种表示方式不同
2. 原码
定义
原码是最直观的表示方法,最高位为符号位,其余位表示数值的绝对值。
[+X]原 = 0 + X
[-X]原 = 1 + X
示例(8位)
原码的问题:
- 0 有两种表示:+0 = 00000000,-0 = 10000000
- 加减法运算复杂,需要先判断符号位
- 不能直接进行算术运算
3. 反码
定义
反码是为了解决原码的问题而提出的:
- 正数的反码 = 原码
- 负数的反码 = 原码的符号位不变,其余位取反(0→1,1→0)
[+X]反 = [+X]原
[-X]反 = [-X]原 符号位不变,数值位取反
示例(8位)
反码的问题:
- 0 仍然有两种表示:+0 = 00000000,-0 = 11111111
- 减法运算仍然需要特殊处理进位
4. 补码
定义
补码是现代计算机采用的表示方法,完美解决了前面的问题:
- 正数的补码 = 原码 = 反码
- 负数的补码 = 反码 + 1
[+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. 补码转原码
将补码转换回原码,只需要重复上述过程:
步骤:
- 如果补码是正数(符号位为0),直接就是原码
- 如果补码是负数(符号位为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;
}