计算机内部只能存储0和1,对于整数,需要一种方式来表示正数和负数。原码、反码、补码就是三种不同的编码方案。
现代计算机统一使用补码来存储有符号整数。原因:
- 补码可以将减法转化为加法运算
- 补码没有“正负0”的问题
- 补码的符号位可以直接参与运算
原码
规则:最高位表示符号(0正1负),其余位表示数值的绝对值。
| 数值 | 原码(8位) |
|---|---|
| +1 | 0000 0001 |
| -1 | 1000 0001 |
| +0 | 0000 0000 |
| -0 | 1000 0000 |
| +127 | 0111 1111 |
| -127 | 1111 1111 |
范围:-127 ~ +127(8位),有正负零两个编码。
反码
规则:
- 正数的反码 = 原码
- 负数的反码 = 符号位不变,数值位按位取反
| 数值 | 原码 | 反码 |
|---|---|---|
| +1 | 0000 0001 | 0000 0001 |
| -1 | 1000 0001 | 1111 1110 |
| +0 | 0000 0000 | 0000 0000 |
| -0 | 1000 0000 | 1111 1111 |
| +127 | 0111 1111 | 0111 1111 |
| -127 | 1111 1111 | 1000 0000 |
范围:-127 ~ +127,仍有正负零问题。
补码
规则:
- 正数的补码 = 原码
- 负数的补码 = 反码 + 1
| 数值 | 原码 | 反码 | 补码 |
|---|---|---|---|
| +1 | 0000 0001 | 0000 0001 | 0000 0001 |
| -1 | 1000 0001 | 1111 1110 | 1111 1111 |
| +0 | 0000 0000 | 0000 0000 | 0000 0000 |
| -0 | 1000 0000 | 1111 1111 | 0000 0000 |
| +127 | 0111 1111 | 0111 1111 | 0111 1111 |
| -127 | 1111 1111 | 1000 0000 | 1000 0001 |
| -128 | 无 | 无 | 1000 0000 |
范围:-128 ~ +127(8位),只有一个零的编码。
注意:-128没有对应的原码和反码,但补码表示为1000 0000。
补码计算推导
减法可以转化为加法。
公式:A – B = (A的补码) + (-B的补码)
示例:-5-3
-5的补码 1111 1011 -3的补码 1111 1101 加法 1111 1011 + 1111 1101 = 1 1111 1000 取低8位 1111 1000 转十进制 补码1111 1000,减1得1111 0111,取反得1000 1000 = -8 ✅
示例:-128-1(溢出)
-128补码 1000 0000 -1补码 1111 1111 加法 1000 0000 + 1111 1111 = 1 0111 1111 取低8位 0111 1111 = 127
相关考点
概念辨析:
- 正数、负数的原码、反码、补码之间的换算关系
- 补码存在的原因
范围记忆:
- 8位有符号整数的范围:-128~127
- 8位原码/反码的范围:-127~127
计算题相关:
- 已知原码求补码
- 已知补码求真值
- 补码加减法结果判断