一、基本定义
1. 原码 (Sign-Magnitude)
- 最高位为符号位(0正,1负)
- 其余位为数值的绝对值
- 表示范围(n位):-(2ⁿ⁻¹-1) ~ +(2ⁿ⁻¹-1)
2. 反码 (1's Complement)
- 正数的反码 = 原码
- 负数的反码 = 符号位不变,数值位取反
3. 补码 (2's Complement) ⭐
- 正数的补码 = 原码
- 负数的补码 = 反码 + 1
二、具体示例(8位系统)
| 十进制 | 原码 | 反码 | 补码(存储格式) |
|---|---|---|---|
| +5 | 0000 0101 |
0000 0101 |
0000 0101 |
| -5 | 1000 0101 |
1111 1010 |
1111 1011 |
| +0 | 0000 0000 |
0000 0000 |
0000 0000 |
| -0 | 1000 0000 |
1111 1111 |
(不存在) |
| -1 | 1000 0001 |
1111 1110 |
1111 1111 |
| -128 | (无法表示) | (无法表示) | 1000 0000 |
三、转换方法
1. 负数原码 → 反码 → 补码
以 -5 为例:
原码:1000 0101
↓ 符号位不变,数值位取反
反码:1111 1010
↓ 加1
补码:1111 1011
2. 补码 → 十进制(负数)
以 1111 1011 为例:
方法1(推荐):
1. 补码:1111 1011
2. 取反(包括符号位):1000 0100
3. 加1:1000 0101 = -5
方法2:
1. 补码:1111 1011(看作无符号数=251)
2. 减去2^8:251 - 256 = -5
四、核心特性对比
| 特性 | 原码 | 反码 | 补码 |
|---|---|---|---|
| 表示范围(8位) | -127 ~ +127 | -127 ~ +127 | -128 ~ +127 |
| 零的表示 | +0 和 -0 | +0 和 -0 | 唯一(00000000) |
| 加减法实现 | 需要判断符号 | 需循环进位 | 直接相加,丢弃溢出 |
| 硬件复杂度 | 高 | 较高 | 低 |
| 现代计算机使用 | 否 | 否 | 是(标准) |
五、运算示例
例1:5 - 3 = 2
5 的补码:0000 0101
-3 的补码:1111 1101 (3→0000 0011→取反1111 1100→加11111 1101)
计算:
0000 0101
+ 1111 1101
------------
1 0000 0010 ← 丢弃进位,得0000 0010 = 2
例2:-5 + 2 = -3
-5 的补码:1111 1011
2 的补码:0000 0010
计算:
1111 1011
+ 0000 0010
------------
1111 1101 ← 这是补码
转十进制:
1111 1101 → 取反1000 0010 → 加11000 0011 = -3
六、记忆要点
- 正数三码合一:正数的原码、反码、补码完全相同
- 负数转换口诀:
原码 → 反码:符号位不变,数值位取反 反码 → 补码:加1 原码 → 补码:符号位不变,数值位取反再加1 - 补码优势:
- 统一了+0和-0
- 扩展了负数表示范围(多表示一个数)
- 减法可以用加法器实现
七、范围总结(n位系统)
| 编码 | 最小值 | 最大值 |
|---|---|---|
| 原码 | -(2ⁿ⁻¹-1) | +(2ⁿ⁻¹-1) |
| 反码 | -(2ⁿ⁻¹-1) | +(2ⁿ⁻¹-1) |
| 补码 | -2ⁿ⁻¹ | +(2ⁿ⁻¹-1) |
8位补码:-128 ~ +127
16位补码:-32768 ~ +32767
32位补码:-2³¹ ~ +2³¹-1
这份修正后的笔记准确描述了反码的计算方式,结构也更适合学习和复习使用。