3 数据编码—原码、反码、补码

正在加载视频播放器…

GESP C++ 三级:数据编码——原码、反码、补码精讲

核心目标:理解机器数与真值,掌握原码、反码、补码的定义与转换规则,掌握补码的加减运算与溢出判断,能快速由补码求真值。
正数三码相同;负数原码符号位为1,反码数值位取反,补码反码加1;计算机存储和运算都用补码。

一、基本概念

1. 机器数与真值

计算机中,有符号整数的二进制表示称为机器数。机器数最高位是符号位:0 表示正数,1 表示负数。机器数对应的实际数值称为真值。

示例(8位):

机器数 真值
00000101 +5
10000101 -5

2. 符号位与数值位

  • 符号位:最高位,0 正 1 负。
  • 数值位:除符号位外的其余位。
  • 数据类型决定位数:char 8 位,int 32 位,long long 64 位。

3. 为什么需要补码

原码和反码存在两个问题:

  1. 0 有两种表示:+0 和 -0,不利于计算机判断。
  2. 减法运算复杂:需要单独处理符号和数值。

补码解决了这两个问题: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. 加法

[A+B]补=[A]补+[B]补 [A+B]_补 = [A]_补 + [B]_补

直接相加,忽略最高位进位。

2. 减法

[A−B]补=[A]补+[−B]补 [A-B]_补 = [A]_补 + [-B]_补

将减法转化为加法。

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. 补码减 1 得反码。
  2. 反码数值位取反得原码。
  3. 原码按权展开,加上负号。

示例:补码 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$
=−128+32+16+8+2+1=−69 = -128 + 32 + 16 + 8 + 2 + 1 = -69

示例:补码 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$
=−128+32+16+4+1=−75 = -128 + 32 + 16 + 4 + 1 = -75

3. 正数补码求真值

符号位为 0,直接按权展开。

示例:补码 0010 1010 → 32+8+2=4232+8+2=42。

八、表示范围

对于 n 位二进制:

编码 范围
原码 −2n−1+1-2^{n-1}+1 ~ 2n−1−12^{n-1}-1
反码
补码 −2n−1-2^{n-1} ~ 2n−1−12^{n-1}-1

常见位数:

位数 补码范围
8 位 -128 ~ 127
16 位 -32768 ~ 32767
32 位 −231-2^{31} ~ 231−12^{31}-1(约 -21 亿 ~ 21 亿)
64 位 −263-2^{63} ~ 263−12^{63}-1

九、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. 正数三码相同,不要给正数求反码、补码时画蛇添足。
  2. 负数补码 = 反码 + 1,不是原码 + 1。
  3. 0 的补码只有一种(00000000),原码和反码各有两种。
  4. 8 位补码最小值是 -128,不是 -127。
  5. 由补码求真值:先减 1 得反码,再取反得原码;或用公式法(最高位权值为负)。
  6. 补码运算忽略最高位进位。
  7. 溢出判断:两个同号数相加,结果符号位相反则溢出。
  8. 计算机中所有整数以补码存储和运算。
  9. 原码和反码不能直接相加减,必须先转补码。
  10. 位数不同时范围不同,注意题目给出的位数。

十一、速查表

操作 方法
求正数原/反/补 都相同,符号位 0,数值位为二进制
求负数原码 符号位 1,数值位为绝对值的二进制
求负数反码 原码数值位取反,符号位不变
求负数补码 反码 + 1
补码转原码 补码减 1 得反码,再数值位取反
补码求真值(公式) 最高位权值为负,其余位权值为正
补码加法 直接相加,忽略最高进位
补码减法 转成加负数补码
溢出判断 同号相加,结果异号则溢出
8 位补码范围 -128 ~ 127
n 位补码范围 −2n−1-2^{n-1} ~ 2n−1−12^{n-1}-1

十二、总结

原码、反码、补码是 GESP 三级数据编码的核心考点。

  1. 机器数最高位是符号位,0 正 1 负。
  2. 正数的原码、反码、补码完全相同。
  3. 负数反码:符号位不变,数值位取反。
  4. 负数补码:反码 + 1。
  5. 0 的补码唯一,原码和反码各两种。
  6. 8 位补码范围 -128 ~ 127,原码/反码范围 -127 ~ 127。
  7. 补码运算:减法转加法,忽略最高进位。
  8. 由补码求真值:减 1 取反,或用公式法。
  9. 溢出判断:两个同号数相加,结果符号位相反。
  10. 计算机存储和运算都用补码。

复习建议:重点练习“求负数的补码”“由补码求真值”“补码加减运算”“溢出判断”四类题。考试中先确定位数,再判断正负,最后套用规则。多练真题中的选择题,熟悉常见陷阱。