3 数据编码—原码、反码、补码
正在加载视频播放器…
GESP C++ 三级:数据编码——原码、反码、补码精讲
核心目标:理解机器数与真值,掌握原码、反码、补码的定义与转换规则,掌握补码的加减运算与溢出判断,能快速由补码求真值。
正数三码相同;负数原码符号位为1,反码数值位取反,补码反码加1;计算机存储和运算都用补码。
一、基本概念
1. 机器数与真值
计算机中,有符号整数的二进制表示称为机器数。机器数最高位是符号位:0 表示正数,1 表示负数。机器数对应的实际数值称为真值。
示例(8位):
| 机器数 | 真值 |
|---|---|
| 00000101 | +5 |
| 10000101 | -5 |
2. 符号位与数值位
- 符号位:最高位,0 正 1 负。
- 数值位:除符号位外的其余位。
- 数据类型决定位数:
char8 位,int32 位,long long64 位。
3. 为什么需要补码
原码和反码存在两个问题:
- 0 有两种表示:+0 和 -0,不利于计算机判断。
- 减法运算复杂:需要单独处理符号和数值。
补码解决了这两个问题:0 只有一种表示,减法可以转化为加法。
二、原码
1. 定义
- 正数:符号位为 0,数值位为该数的二进制绝对值。
- 负数:符号位为 1,数值位为该数绝对值的二进制。
2. 示例(8位)
| 真值 | 原码 |
|---|---|
| +5 | 00000101 |
| -5 | 10000101 |
| +0 | 00000000 |
| -0 | 10000000 |
| +127 | 01111111 |
| -127 | 11111111 |
3. 特点
- 0 有两种表示:+0 和 -0。
- 表示范围(8位):-127 ~ +127。
- 不能直接进行减法运算。
三、反码
1. 定义
- 正数:与原码相同。
- 负数:符号位保持 1,数值位按位取反。
2. 示例(8位)
| 真值 | 原码 | 反码 |
|---|---|---|
| +5 | 00000101 | |
| -5 | 10000101 | 11111010 |
| +0 | 00000000 | |
| -0 | 10000000 | 11111111 |
3. 特点
- 0 仍有两种表示:+0(00000000)和 -0(11111111)。
- 表示范围(8位):-127 ~ +127。
- 反码通常作为求补码的中间步骤。
四、补码
1. 定义
- 正数:与原码、反码相同。
- 负数:反码 + 1。
2. 示例(8位)
| 真值 | 原码 | 反码 | 补码 |
|---|---|---|---|
| +5 | 00000101 | ||
| -5 | 10000101 | 11111010 | 11111011 |
| +0 | 00000000 | 00000000 | |
| -0 | 10000000 | 11111111 | |
| -128 | 无法表示 | 10000000 | |
3. 特点
- 0 只有一种表示:00000000。
- 表示范围(8位):-128 ~ +127。
- 比原码、反码多表示一个最小负数。
- 计算机中整数一律用补码存储和运算。
4. 补码的快捷求法
负数补码:从右往左,找到第一个 1,这个 1 及其右边的 0 保持不变,左边的所有位取反(符号位不变)。
示例:求 -52 的补码(8位)。
52 的二进制:00110100
原码: 10110100
从右往左找第一个1:最低位是0,次低位是0,第三位是1(从右数第3位)
保持这个1及其右边的0不变:...100
左边取反(符号位不变):11001100
补码:11001100
验证:反码法:原码 10110100 → 反码 11001011 → 补码 11001100。一致。
五、三种编码对比(8位)
| 真值 | 原码 | 反码 | 补码 |
|---|---|---|---|
| +5 | 00000101 | ||
| -5 | 10000101 | 11111010 | 11111011 |
| +0 | 00000000 | 00000000 | |
| -0 | 10000000 | 11111111 | |
| +127 | 01111111 | ||
| -127 | 11111111 | 10000000 | 10000001 |
| -128 | 无法表示 | 10000000 | |
总结:
- 正数:原码 = 反码 = 补码。
- 负数:补码 = 反码 + 1。
- 0:补码唯一,原码和反码各两种。
- 范围:原码/反码 -127~127,补码 -128~127。
六、补码的运算
1. 加法
直接相加,忽略最高位进位。
2. 减法
将减法转化为加法。
3. 示例:5 + 3
+5 补码:00000101
+3 补码:00000011
相加: 00000101 + 00000011 = 00001000
结果: 00001000(补码)→ +8
4. 示例:5 - 3
+5 补码:00000101
-3 补码:11111101
相加: 00000101 + 11111101 = 100000010
忽略最高进位,保留8位:00000010
结果: 00000010(补码)→ +2
5. 示例:-5 + (-3)
-5 补码:11111011
-3 补码:11111101
相加: 11111011 + 11111101 = 111111000
忽略最高进位,保留8位:11111000
结果: 11111000(补码)→ -8
6. 溢出判断
方法一:两个同号数相加,若结果的符号位与它们相反,则溢出。
方法二:最高位进位和次高位进位不同,则溢出。
示例:127 + 1
+127 补码:01111111
+1 补码:00000001
相加: 01111111 + 00000001 = 10000000
结果: 10000000(补码)→ -128
两个正数相加得到负数,溢出!
七、由补码求真值
1. 方法一:补码 → 反码 → 原码 → 真值
若符号位为 1:
- 补码减 1 得反码。
- 反码数值位取反得原码。
- 原码按权展开,加上负号。
示例:补码 1011 1011 求真值。
补码:1011 1011
反码:1011 1010(减1)
原码:1100 0101(数值位取反)
真值:-(64+4+1) = -69
2. 方法二:公式法(推荐)
对于 n 位补码,真值 = $-a_{n-1} \times 2^{n-1} + \sum_{i=0}^{n-2} a_i \times 2^i$
即最高位权值为负,其余位权值为正。
示例:补码 1011 1011(8位)。
$-1 \times 2^7 + 0 \times 2^6 + 1 \times 2^5 + 1 \times 2^4 + 1 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0$
示例:补码 1011 0101(8位)。
$-128 + 0 \times 64 + 1 \times 32 + 1 \times 16 + 0 \times 8 + 1 \times 4 + 0 \times 2 + 1 \times 1$
3. 正数补码求真值
符号位为 0,直接按权展开。
示例:补码 0010 1010 → 。
八、表示范围
对于 n 位二进制:
| 编码 | 范围 |
|---|---|
| 原码 | ~ |
| 反码 | |
| 补码 | ~ |
常见位数:
| 位数 | 补码范围 |
|---|---|
| 8 位 | -128 ~ 127 |
| 16 位 | -32768 ~ 32767 |
| 32 位 | ~ (约 -21 亿 ~ 21 亿) |
| 64 位 | ~ |
九、GESP 三级真题示例
1. 2025年6月 第1题
8位二进制原码能表示的最小整数是( )
A) -127 B) -128 C) -255 D) -256
答案:A
解析:8位原码范围 -127 ~ +127,-128 无法用原码表示。
2. 2025年6月 第2题
反码表示中,零的表示形式有( )种。
A) 1 B) 2 C) 3 D) 4
答案:B
解析:+0(00000000)和 -0(11111111)。
3. 2025年6月 第3题
补码
1011 1011对应的真值是( )
A) -69 B) -68 C) 69 D) 68
答案:A
解析:公式法:-128+32+16+8+2+1 = -69。
4. 2026年3月 第5题
-15 的补码是( )
A) 11110000 B) 11110001 C) 10001111 D) 10001110
答案:B
解析:15 原码 00001111 → 反码 11110000 → 补码 11110001。
5. 2026年3月 第7题
补码
1011 0101对应的真值是( )
A) -75 B) -74 C) 75 D) 74
答案:A
解析:-128+32+16+4+1 = -75。
十、易错点汇总
- 正数三码相同,不要给正数求反码、补码时画蛇添足。
- 负数补码 = 反码 + 1,不是原码 + 1。
- 0 的补码只有一种(00000000),原码和反码各有两种。
- 8 位补码最小值是 -128,不是 -127。
- 由补码求真值:先减 1 得反码,再取反得原码;或用公式法(最高位权值为负)。
- 补码运算忽略最高位进位。
- 溢出判断:两个同号数相加,结果符号位相反则溢出。
- 计算机中所有整数以补码存储和运算。
- 原码和反码不能直接相加减,必须先转补码。
- 位数不同时范围不同,注意题目给出的位数。
十一、速查表
| 操作 | 方法 |
|---|---|
| 求正数原/反/补 | 都相同,符号位 0,数值位为二进制 |
| 求负数原码 | 符号位 1,数值位为绝对值的二进制 |
| 求负数反码 | 原码数值位取反,符号位不变 |
| 求负数补码 | 反码 + 1 |
| 补码转原码 | 补码减 1 得反码,再数值位取反 |
| 补码求真值(公式) | 最高位权值为负,其余位权值为正 |
| 补码加法 | 直接相加,忽略最高进位 |
| 补码减法 | 转成加负数补码 |
| 溢出判断 | 同号相加,结果异号则溢出 |
| 8 位补码范围 | -128 ~ 127 |
| n 位补码范围 | ~ |
十二、总结
原码、反码、补码是 GESP 三级数据编码的核心考点。
- 机器数最高位是符号位,0 正 1 负。
- 正数的原码、反码、补码完全相同。
- 负数反码:符号位不变,数值位取反。
- 负数补码:反码 + 1。
- 0 的补码唯一,原码和反码各两种。
- 8 位补码范围 -128 ~ 127,原码/反码范围 -127 ~ 127。
- 补码运算:减法转加法,忽略最高进位。
- 由补码求真值:减 1 取反,或用公式法。
- 溢出判断:两个同号数相加,结果符号位相反。
- 计算机存储和运算都用补码。
复习建议:重点练习“求负数的补码”“由补码求真值”“补码加减运算”“溢出判断”四类题。考试中先确定位数,再判断正负,最后套用规则。多练真题中的选择题,熟悉常见陷阱。