Skip to content

408 计算机组成原理

408

计算机组成原理

CO-02-02 定点数的编码(原码/反码/补码/移码)


一、定位信息

项目内容
所属圈层核心层
考点热度H级(高频重点) — 近5年真题中几乎每年必考,选择题和综合题均有出现,单次分值2–5分;常与"补码运算""溢出判断""IEEE 754"结合考查
前置知识回顾需掌握二进制与十进制的互转(CO-02-01),理解二进制的位权概念
知识网络定位本单元是补码加减运算(CO-02-03)和乘除运算(CO-02-04)的直接基础,也是理解IEEE 754浮点数(CO-02-05)中阶码编码方式的前提

二、知识点讲解

2.1 定点数的基本概念

定点数是指小数点位置固定的数。在计算机中,定点数有两种常见约定:

  • 定点整数:小数点固定在最低位之后,如 X=xnxn1x1x0X = x_n x_{n-1} \cdots x_1 x_0,表示整数 XX
  • 定点小数:小数点固定在符号位之后、最高数值位之前,如 X=x0.x1x2xnX = x_0.x_1 x_2 \cdots x_n,表示 X<1|X| < 1 的纯小数

定点数的表示需要解决两个问题:符号如何编码(用什么方式表示正负号)和数值如何编码(用什么方式表示绝对值大小)。由此产生了四种编码方式。

2.2 原码表示

定义:最高位为符号位(0正1负),其余位为数值的绝对值。

定点整数原码n+1n+1 位,含1位符号位):

[X]={X0X2n12nX(2n1)X0[X]_{\text{原}} = \begin{cases} X & 0 \leq X \leq 2^n - 1 \\ 2^n - X & -(2^n - 1) \leq X \leq 0 \end{cases}

定点小数原码n+1n+1 位,含1位符号位):

[X]={X0X<11X1<X0[X]_{\text{原}} = \begin{cases} X & 0 \leq X < 1 \\ 1 - X & -1 < X \leq 0 \end{cases}

示例(8位定点整数):

  • +25[00011001]+25 \to [00011001]_{\text{原}}(符号位0,数值位为25的二进制)
  • 25[10011001]-25 \to [10011001]_{\text{原}}(符号位1,数值位相同)

原码零的表示:有两种——[+0]=00000000[+0]_{\text{原}} = 00000000[0]=10000000[-0]_{\text{原}} = 10000000,这是原码的一个缺点。

2.3 反码表示

定义:正数的反码与原码相同;负数的反码是将原码的数值位逐位取反(0变1,1变0)。

定点整数反码n+1n+1 位):

[X]={X0X2n1(2n+11)+X(2n1)X0[X]_{\text{反}} = \begin{cases} X & 0 \leq X \leq 2^n - 1 \\ (2^{n+1} - 1) + X & -(2^n - 1) \leq X \leq 0 \end{cases}

示例(8位定点整数):

  • +25[00011001]+25 \to [00011001]_{\text{反}}(同原码)
  • 25-25:原码为 1001100110011001,数值位取反 [11100110]\to [11100110]_{\text{反}}

反码零的表示:同样有两种——[+0]=00000000[+0]_{\text{反}} = 00000000[0]=11111111[-0]_{\text{反}} = 11111111

2.4 补码表示(最重要)

定义:正数的补码与原码相同;负数的补码 = 反码 + 1(在最低位加1)。

定点整数补码n+1n+1 位):

[X]={X0X2n12n+1+X2nX<0[X]_{\text{补}} = \begin{cases} X & 0 \leq X \leq 2^n - 1 \\ 2^{n+1} + X & -2^n \leq X < 0 \end{cases}

定点小数补码n+1n+1 位):

[X]={X0X<12+X1X<0[X]_{\text{补}} = \begin{cases} X & 0 \leq X < 1 \\ 2 + X & -1 \leq X < 0 \end{cases}

示例(8位定点整数):

  • +25[00011001]+25 \to [00011001]_{\text{补}}(同原码)
  • 25-25:原码 1001100110011001 → 反码 1110011011100110 → 加1 → [11100111][11100111]_{\text{补}}

补码零的表示唯一[+0]=[0]=00000000[+0]_{\text{补}} = [-0]_{\text{补}} = 00000000,这是补码的重要优势。

补码的特殊值(8位整数):

  • 能表示的最小负数为 128-128,其补码为 1000000010000000(注意:128-128 没有对应的原码表示)
  • 表示范围:[128,+127][-128, +127],比原码多表示一个负数

补码的快速求法(从低位到高位找到第一个1,该位及其右边不变,左边所有位取反):

  • 25-25:原码 1001100110011001,从右往左第一个1在第0位(最右),该位右边无,左边取反 → 1110011111100111

2.5 移码表示

定义:移码 = 补码的符号位取反(即在补码基础上翻转最高位),或者直接用 X+2nX + 2^n 来计算。

[X]=2n+X(2nX2n1)[X]_{\text{移}} = 2^n + X \quad (-2^n \leq X \leq 2^n - 1)

示例(8位定点整数,n=7n=7):

  • +25+25:补码 0001100100011001,符号位取反 [10011001]\to [10011001]_{\text{移}}
  • 25-25:补码 1110011111100111,符号位取反 [01100111]\to [01100111]_{\text{移}}

移码的核心特点:移码的大小可以直接反映真值的大小关系。移码越大,对应的真值越大。这使得移码非常适合用于浮点数的阶码(IEEE 754标准中阶码就用移码表示)。

移码零的表示唯一[0]=10000000[0]_{\text{移}} = 10000000(8位时)。

2.6 四种编码方式对比总结

特征原码反码补码移码
正数编码同真值同真值同真值符号位取反
负数编码符号位1+绝对值原码数值位取反反码+1补码符号位取反
零的表示两种(+0,-0)两种(+0,-0)唯一唯一
表示范围(8位)-127 ~ +127-127 ~ +127-128 ~ +127-128 ~ +127
能否直接加减不能(需判断符号)不能能(硬件最简)能(但少见)
主要用途理解概念过渡形式计算机内部运算浮点数阶码
与真值关系符号+绝对值符号+取反模运算线性映射

三、记忆与理解辅助

3.1 口诀与技巧

  1. 原码→反码→补码的转换口诀

    • "正数三码合一,负数逐级变换"
    • 正数:原码 = 反码 = 补码
    • 负数:原码 → 反码(数值位取反)→ 补码(反码+1)
  2. 补码求值的直觉法

    • 看到补码,先判断符号位:符号位为0就是正数(直接读);符号位为1是负数
    • 负数补码求真值:再求一次补码("补码的补码是原码"),然后加负号
    • 快速法:从最低位找到第一个1,该位及右边不变,左边取反,加负号
  3. 移码的记忆要点

    • "移码 = 补码翻符号"——最简单的记忆
    • 移码越大真值越大——这是移码的核心价值
    • 0的移码是 1000100\cdots0——刚好在中间
  4. 补码多表示一个负数的理解

    • 原码中 +0+00-0 占了两个编码,补码将 0-0 的编码"让"给了 128-128
    • 8位补码:1000000010000000 不是 0-0,而是 128-128

3.2 对比表:8位定点整数的四种编码(关键对照表)

真值原码反码补码移码
+12701111111011111110111111111111111
+100000001000000010000000110000001
+000000000000000000000000010000000
-010000000111111110000000010000000
-110000001111111101111111101111111
-12711111111100000001000000100000001
-1281000000000000000

3.3 真值与补码互转的快捷流程

真值 → 补码

  1. 正数:直接转二进制,高位补0
  2. 负数:先求绝对值的二进制 → 按位取反 → 末位加1

补码 → 真值

  1. 符号位为0:直接读数值
  2. 符号位为1:再求一次补码(取反+1),读出数值后加负号

四、例题与精解

例题1(基础巩固)

命题意图:考查四种编码方式之间的相互转换,验证对定义的理解。

题目:设机器字长为8位,分别用原码、反码、补码和移码表示十进制数 53-53

审题分析

  • 已知:真值 53-53,字长8位
  • 求解:四种编码表示
  • 关键:先求绝对值53的二进制,再按规则逐级转换

解题思路

  1. 求53的二进制
  2. 正数编码规则:正数三码合一,移码符号取反
  3. 负数编码规则:原码符号置1→反码数值取反→补码+1→移码符号取反

完整步骤

第一步5310=32+16+4+1=00110101253_{10} = 32 + 16 + 4 + 1 = 00110101_2

第二步:原码(符号位1 + 绝对值) [53]=1 0110101=10110101[-53]_{\text{原}} = 1\ 0110101 = 10110101

第三步:反码(数值位取反) [53]=1 1001010=11001010[-53]_{\text{反}} = 1\ 1001010 = 11001010

第四步:补码(反码+1) [53]=11001010+1=11001011[-53]_{\text{补}} = 11001010 + 1 = 11001011

第五步:移码(补码符号位取反) [53]=01001011[-53]_{\text{移}} = 01001011

验证:从补码 1100101111001011 反推真值

  • 符号位为1,是负数
  • 求补码的补码:取反 0011010000110100,加1得 00110101=5300110101 = 53
  • 真值为 53-53

方法反思

  • 转换链条是单向的:原码 → 反码 → 补码 → 移码,每一步都是确定性的
  • 正数的四种编码只需处理符号位,数值部分完全相同
  • 验证环节不可省略,养成习惯

例题2(中等提升)

命题意图:考查已知补码求真值的能力,以及对补码表示范围的理解。

题目:已知某8位机器数的补码为 1000011010000110,求其对应的十进制真值。若将该编码分别按原码和移码解读,结果是什么?

审题分析

  • 已知:8位补码 1000011010000110
  • 求解:①真值 ②原码解读 ③移码解读
  • 关键:按不同编码的规则分别求值

解题思路

  1. 补码→真值:判断符号,负数需要再求一次补码
  2. 原码解读:直接按原码规则(符号位+绝对值)
  3. 移码解读:移码 = 补码翻符号,所以补码翻符号后当补码读

完整步骤

① 补码求真值

  • 符号位为1,是负数
  • 求补码的补码:取反 0111100101111001,加1得 01111010=12201111010 = 122
  • 真值 = 122-122

② 按原码解读

  • 符号位1表示负数,数值位 0000110=60000110 = 6
  • 原码表示 6-6

③ 按移码解读

  • 移码的符号位取反得补码:0000011000000110
  • 补码符号位为0,是正数,真值为 66

对比总结:同一二进制串 1000011010000110,按不同编码解读:

编码方式真值
补码122-122
原码6-6
移码+6+6

方法反思

  • 同一个二进制序列,按不同编码规则解读会得到完全不同的真值
  • 解题时必须明确"这是什么编码",不能想当然
  • 补码 1000000010000000 是特殊值,等于 128-128,没有对应的原码表示

五、考情分析

分析维度具体情况
近5年考查频次几乎每年必考,选择题1–2道或作为综合题的一部分
常见题型选择题(给真值求编码、给编码求真值)、综合题(与运算、溢出结合)
分值占比2–5分/次,若出现在综合题中分值更高
命题趋势纯记忆性考查减少,更多与"补码加减运算""溢出判断""IEEE 754阶码"等实际应用结合考查;近年增加了"已知编码推断数据类型"的题型

:考情数据基于大纲权重与通用命题规律推测,待真题分析子代理产出后校准。


六、易错点提醒

易错点1

  • 错误表现:负数求补码时,直接在原码上加1,跳过反码步骤
  • 错误原因:混淆了"反码+1"中的"反码"是数值位取反的结果,不是原码本身
  • 正确做法:严格按三步走——原码 → 数值位取反得反码 → 反码末位加1得补码。或使用快速法:从最低位找到第一个1,该位及右边不变,左边取反

易错点2

  • 错误表现:认为 128-128 可以用原码表示,或试图求 128-128 的原码
  • 错误原因:8位原码的表示范围是 [127,+127][-127, +127]128-128 超出原码能表示的范围
  • 正确做法128-128 只能用补码表示(1000000010000000),它没有对应的原码形式。考试中若问"128-128的原码是什么",应回答"不存在"

易错点3

  • 错误表现:求补码真值时忘记加负号,直接把补码当正数读
  • 错误原因:看到补码数值位的二进制就直接当正数,忽略了符号位为1意味着是负数
  • 正确做法:符号位为1时,必须对整个补码再求一次补码(取反+1),得出绝对值后加负号

易错点4

  • 错误表现:混淆移码与补码的关系,认为移码是补码加1或减1
  • 错误原因:将移码的定义与其他编码变换混淆
  • 正确做法:移码 = 补码的符号位取反(翻转最高位),其余位不变。记住"翻符号"三个字即可

七、来源标注

  • 依据2026考研统考大纲"计算机组成原理"第二章"数据的表示和运算"中"定点数的表示"相关内容
  • 依据大学本科经典教材共识(唐朔飞《计算机组成原理》、白中英《计算机组成原理》、Patterson & Hennessy《计算机组成与设计》)

本知识单元为CO-02"数据的表示和运算"系列第2单元,下一单元将讲解补码加减运算与溢出判断。

考研全科复习资料 - 基于2026考研统考大纲