二进制数的表示与运算:原码、反码、补码与移码
二进制是计算机存储和运算的基础,带符号的二进制数通过特定编码方式(原码、反码、补码、移码)处理正负值,其中补码是计算机底层实际采用的存储形式。以下从编码规则、表示范围到存储原理展开详细说明:
二进制数的符号表示与基本概念
符号位
- 二进制数用最高位表示正负:
0代表正数,1代表负数。 - 例如:4 位二进制中,
0011表示+3,1011表示-3(最高位1为符号位)。
真值与机器数
- 真值:带符号位的二进制数对应的实际数值(如
+3、-3)。 - 机器数:计算机中实际存储的带符号二进制数(如
0011、1011)。
字长
- 指计算机一次可处理的二进制位数(如 32 位、64 位),决定了数值的表示范围。
四种编码方式的规则与示例
设字长为n位(含 1 位符号位),以n=4为例(符号位 1 位,数值位 3 位):
原码
规则:
- 正数:符号位为
0,数值位为真值的绝对值(如+3→0011)。 - 负数:符号位为
1,数值位为真值的绝对值(如-3→1011)。
- 正数:符号位为
特殊值:
+0原码为0000,-0原码为1000(存在两个 0 的表示)。
示例:
| 真值 | 原码 |
| —— | —— |
| +3 | 0011 |
| -3 | 1011 |
| +0 | 0000 |
| -0 | 1000 |
反码
规则:
- 正数:反码与原码相同(如
+3→0011)。 - 负数:符号位不变,数值位按位取反(
0变1,1变0)(如-3原码1011→反码1100)。
- 正数:反码与原码相同(如
特殊值:
+0反码为0000,-0反码为1111(仍有两个 0)。
示例:
| 真值 | 反码 |
| —— | —— |
| +3 | 0011 |
| -3 | 1100 |
| +0 | 0000 |
| -0 | 1111 |
补码(计算机实际存储方式)
规则:
- 正数:补码与原码、反码相同(如
+3→0011)。 - 负数:补码 = 反码 + 1(符号位不变,数值位计算时进位忽略符号位)(如
-3反码1100→补码1101)。
- 正数:补码与原码、反码相同(如
特殊值:
+0和-0的补码统一为0000(解决了 0 的二义性)。- 字长为
n时,最小负数补码为100...0(如 4 位中1000表示-8)。
示例:
| 真值 | 补码 |
| —— | ——————— |
| +3 | 0011 |
| -3 | 1101 |
| 0 | 0000 |
| -8 | 1000(n=4 时) |
移码
规则:
- 移码 = 补码的符号位取反(如
+3补码0011→移码1011;-3补码1101→移码0101)。
- 移码 = 补码的符号位取反(如
用途:常用于表示浮点数的阶码(指数),便于比较大小(移码的数值大小与真值一致)。
示例:
| 真值 | 补码 | 移码 |
| —— | —— | —— |
| +3 | 0011 | 1011 |
| -3 | 1101 | 0101 |
| 0 | 0000 | 1000 |
不同编码的表示范围(字长 n 位)
| 码制 | 定点整数范围 | 定点小数范围 | 可表示的数码个数 |
|---|---|---|---|
| 原码 | (-(2^{n-1}-1) ~ +(2^{n-1}-1)) | (-(1-2^{-(n-1)}) ~ +(1-2^{-(n-1)})) | (2^n - 1) |
| 反码 | (-(2^{n-1}-1) ~ +(2^{n-1}-1)) | (-(1-2^{-(n-1)}) ~ +(1-2^{-(n-1)})) | (2^n - 1) |
| 补码 | (-2^{n-1} ~ +(2^{n-1}-1)) | (-1 ~ +(1-2^{-(n-1)})) | (2^n) |
| 移码 | (-2^{n-1} ~ +(2^{n-1}-1)) | (-1 ~ +(1-2^{-(n-1)})) | (2^n) |
- 关键差异:补码和移码比原码、反码多表示一个最小负数(如 4 位补码可表示
-8,原码 / 反码最大负数为-7)。
计算机采用补码存储的原因
统一 0 的表示: 原码和反码中
+0与-0并存(如 4 位原码0000和1000),补码中0只有一种表示(0000),节省存储空间。简化加减法运算: 补码将减法转换为加法(
a - b = a + (-b)的补码),无需单独设计减法电路,硬件实现更简单。示例:计算
1
3 - 2 = 1
- 转为补码加法:
3补码0011+(-2)补码1110=0001(补码)→ 真值1,结果正确。
- 转为补码加法:
符号位参与运算: 补码的符号位可直接参与加法运算,无需额外处理,简化运算逻辑