Appearance
408 计算机组成原理
408
计算机组成原理
CO-02-01 数制与编码(进制转换/BCD码/字符编码)
一、定位信息
| 项目 | 内容 |
|---|---|
| 所属圈层 | 核心层 |
| 考点热度 | M级(中频常考) — 近5年真题中以选择题形式出现2–3次,累计分值约2–4分;常与"补码表示""ASCII码""BCD码"等知识点结合出题 |
| 前置知识回顾 | 了解十进制数的基本概念(位权、小数点),具备基本的乘除法运算能力即可衔接 |
| 知识网络定位 | 本单元是第二章"数据的表示和运算"的起始基础,为后续定点数编码(CO-02-02)、补码运算(CO-02-03)和浮点数表示(CO-02-05)提供数制与编码的前置知识 |
二、知识点讲解
2.1 进位计数制
进位计数制是用一组固定的数字符号和统一的规则来表示数值的方法。日常使用十进制(Decimal),计算机内部使用二进制(Binary),编程中常用八进制(Octal)和十六进制(Hexadecimal)。
核心概念——基数与位权:
- 基数:一个数制中允许使用的数字符号个数。十进制基数为10(0–9),二进制基数为2(0–1)。
- 位权:每一位上的数字所代表的实际值等于该数字乘以该位的权值。第 位的权为 ( 为基数)。
例如十进制数 可展开为:
二进制数 展开为:
2.2 进制转换方法
2.2.1 任意进制 → 十进制:按权展开求和
将每一位的数字乘以对应位权,然后相加。
例:
2.2.2 十进制 → 任意进制
整数部分:除基取余法(短除法)
将十进制整数反复除以目标基数,取每次的余数,从最后一次余数开始(从高位到低位)排列。
例:将 转换为二进制
| 运算 | 商 | 余数 |
|---|---|---|
| 25 ÷ 2 | 12 | 1(最低位) |
| 12 ÷ 2 | 6 | 0 |
| 6 ÷ 2 | 3 | 0 |
| 3 ÷ 2 | 1 | 1 |
| 1 ÷ 2 | 0 | 1(最高位) |
从下往上读取余数:
小数部分:乘基取整法
将十进制小数反复乘以目标基数,取每次乘积的整数部分,从高位到低位排列。
例:将 转换为二进制
| 运算 | 整数部分 | 小数部分 |
|---|---|---|
| 0.6875 × 2 = 1.375 | 1 | 0.375 |
| 0.375 × 2 = 0.75 | 0 | 0.75 |
| 0.75 × 2 = 1.5 | 1 | 0.5 |
| 0.5 × 2 = 1.0 | 1 | 0.0 |
从上往下读取整数:
⚠️ 注意:有些十进制小数无法精确转换为有限位二进制小数(如 ),会出现无限循环,此时需要截断或舍入。
2.2.3 二进制 ↔ 八进制/十六进制的快速转换
由于 ,,可以直接按位分组转换:
- 二进制 → 八进制:以小数点为界,每3位二进制数分为一组,不足补0,每组直接转为1位八进制数。
- 二进制 → 十六进制:每4位一组。
例:
- 三位一组(八进制):
- 四位一组(十六进制):
2.3 BCD码(Binary-Coded Decimal)
BCD码用4位二进制数来表示1位十进制数(0–9)。主要有以下几种:
| 编码名称 | 编码规则 | 特点 |
|---|---|---|
| 8421码(NBCD) | 每位二进制的权值分别为8、4、2、1,与自然二进制一致 | 最常用;0–9的编码为0000–1001;10–15为非法码 |
| 余3码 | 在8421码基础上加3(即0011) | 属于无权码;0→0011,9→1100;两个余3码相加恰好产生进位时结果需要修正 |
| 2421码 | 每位权值为2、4、2、1 | 有权码;具有自补性,0和9、1和8等互为按位取反 |
8421码的加法修正规则:两个8421码相加,若结果在1010–1111(即10–15)之间或产生进位,则需加6(0110)修正。
例: 的8421码运算
- ,
- (12,非法码)
- 加6修正:
- 结果: ✓
2.4 字符编码
2.4.1 ASCII码
ASCII(American Standard Code for Information Interchange) 使用7位二进制编码,共表示128个字符:
| 范围 | 编码(十进制) | 内容 |
|---|---|---|
| 控制字符 | 0–31 | 回车(CR=13)、换行(LF=10)、空格(SP=32)等 |
| 数字字符 '0'–'9' | 48–57 | 0的编码为48,即 |
| 大写字母 'A'–'Z' | 65–90 | A的编码为65 |
| 小写字母 'a'–'z' | 97–122 | a的编码为97 |
关键规律:
- 数字字符转数值:减去48(即字符'0'的编码),如 '5' − '0' = 53 − 48 = 5
- 大写转小写:加32(或置第5位为1),如 'A'(65) + 32 = 'a'(97)
- 小写转大写:减32(或清第5位为0)
2.4.2 汉字编码
汉字编码涉及多个层次:
| 编码类型 | 说明 |
|---|---|
| 输入码 | 拼音码、五笔码等,用于输入汉字 |
| 国标码(交换码) | GB2312标准,每个汉字用2字节表示,每字节最高位为0 |
| 区位码 | 将汉字排列在94×94的矩阵中,用区号和位号表示 |
| 机内码 | 计算机内部存储汉字的编码,将国标码每字节最高位置1(加80H) |
转换关系:
- 国标码 = 区位码 + 2020H(每字节加20H,即32)
- 机内码 = 国标码 + 8080H(每字节加80H,即128)
- 机内码 = 区位码 + A0A0H
2.5 校验码基础(支撑层补充)
为后续理解海明码等检错纠错机制,简要介绍奇偶校验:
- 奇校验:使编码中1的个数为奇数
- 偶校验:使编码中1的个数为偶数
- 仅能检测奇数位错误,不能纠正错误,也不能检测偶数位错误
三、记忆与理解辅助
3.1 口诀与技巧
进制转换口诀:
- 整数部分"除基取余,逆序排列"——从下往上读余数
- 小数部分"乘基取整,顺序排列"——从上往下读整数
- 记忆方式:整数"向下挖"(除法往下走,余数往上翻),小数"向上冒"(乘法往上走,整数往外拿)
ASCII码速记:
- '0' = 48,'A' = 65,'a' = 97
- 大写 + 32 = 小写(差值恒为32)
- 记忆:"48起数字,65起大写,97起小写"
BCD码加法修正口诀:"大于9或有进位,加6修正别忘记"
二进制 ↔ 八/十六进制速转:
- 三位合一 → 八进制(因为 )
- 四合一 → 十六进制(因为 )
3.2 对比表:常用进制
| 特征 | 二进制(Binary) | 八进制(Octal) | 十进制(Decimal) | 十六进制(Hex) |
|---|---|---|---|---|
| 基数 | 2 | 8 | 10 | 16 |
| 数字 | 0, 1 | 0–7 | 0–9 | 0–9, A–F |
| 计算机中的用途 | 内部运算 | 简化二进制书写 | 人类日常使用 | 地址/数据表示 |
| 与二进制关系 | 本身 | 每3位二进制=1位 | 需转换 | 每4位二进制=1位 |
3.3 对比表:三种BCD码
| 编码 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 类型 | 自补性 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 8421码 | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 有权码 | 无 |
| 余3码 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 无权码 | 有 |
| 2421码 | 0000 | 0001 | 0010 | 0011 | 0100 | 1011 | 1100 | 1101 | 1110 | 1111 | 有权码 | 有 |
四、例题与精解
例题1(基础巩固)
命题意图:考查十进制到二进制的转换能力,特别是小数部分的精确转换。
题目:将十进制数 转换为二进制数。
审题分析:
- 已知:十进制数
- 求解:对应的二进制表示
- 关键:整数部分和小数部分分别转换
解题思路:
- 整数部分(13):使用除基取余法
- 小数部分(0.625):使用乘基取整法
完整步骤:
第一步:整数部分(13)
| 13 ÷ 2 | 商 = 6 | 余 = 1 |
|---|---|---|
| 6 ÷ 2 | 商 = 3 | 余 = 0 |
| 3 ÷ 2 | 商 = 1 | 余 = 1 |
| 1 ÷ 2 | 商 = 0 | 余 = 1 |
从下往上:
第二步:小数部分(0.625)
| 整数 = 1 | 小数 = 0.25 | |
|---|---|---|
| 整数 = 0 | 小数 = 0.5 | |
| 整数 = 1 | 小数 = 0.0 |
从上往下:
第三步:合并
验证: ✓
方法反思:
- 有限位二进制小数只能精确表示分母为2的幂次的十进制小数
- 如果小数部分经过若干次乘法后无法归零,说明该小数无法用有限位二进制精确表示,需要截断或舍入
例题2(中等提升)
命题意图:考查BCD码的加法运算及修正规则,同时检验对8421码非法码的识别能力。
题目:用8421码表示 ,写出完整的编码运算过程及修正结果。
审题分析:
- 已知:两个十进制数 58 和 37
- 求解:用8421码完成加法,展示修正过程
- 关键:按位相加后检查是否需要加6修正
解题思路:
- 分别将58和37转换为8421码
- 按位相加
- 检查每一位是否出现非法码(1010–1111),若有则加6修正
完整步骤:
第一步:编码
- ,,所以
- ,,所以
第二步:按位相加
低4位(个位):(15,非法码!) 高4位(十位):(8)
第三步:加6修正
低4位修正:(产生进位)
- 低4位结果为 (5),进位1加到高4位
高4位修正:(9)
- 检查:,合法,无需再修正
最终结果: ✓(因为 )
方法反思:
- 修正的核心思路:8421码中1010–1111是非法码,加6(0110)恰好将其"跳过"到合法的进位状态
- 逐位检查是关键:先看低位是否需要修正,修正产生的进位再传到高位
- 余3码的加法规则不同:两个余3码相加,若结果合法则减3修正
五、考情分析
| 分析维度 | 具体情况 |
|---|---|
| 近5年考查频次 | 选择题约2–3次,偶尔作为大题中的小问出现 |
| 常见题型 | 选择题为主(进制转换、ASCII码值、BCD码识别) |
| 分值占比 | 选择题2分左右,偶尔在综合题中作为子问题出现(1–2分) |
| 命题趋势 | 单独出题概率较低,但作为其他知识点(补码、浮点数)的基础,常被隐含考查。近年趋势:与硬件设计结合,如给出存储内容要求反推编码方式 |
注:考情数据基于大纲权重与通用命题规律推测,待真题分析子代理产出后校准。
六、易错点提醒
易错点1
- 错误表现:将十进制小数转二进制时,误以为所有小数都能精确转换,不检查小数部分是否归零
- 错误原因:受十进制思维影响,认为"小数总是可以精确表示的"
- 正确做法:转换时严格按乘基取整法操作,若小数部分始终不为0则为无限循环二进制小数,需根据精度要求截断
易错点2
- 错误表现:混淆国标码、区位码和机内码的转换关系,忘记加的是H进制还是十进制
- 错误原因:三个编码之间的偏移量不同(区位码+20H得国标码,国标码+80H得机内码),容易记混顺序或偏移值
- 正确做法:记住"区位码→国标码→机内码"的链条,偏移量分别是20H和80H。也可以直接记:机内码 = 区位码 + A0A0H
易错点3
- 错误表现:BCD码加法运算时忘记修正,或将修正规则应用于不需要修正的情况
- 错误原因:没有理解修正的本质——只有当结果出现非法码(1010–1111)或产生进位时才需要加6
- 正确做法:加法完成后,逐位检查:若该位结果 ≤ 1001(9),则合法不需修正;若 ≥ 1010(10),则加0110(6)修正
易错点4
- 错误表现:混淆字符'0'的ASCII码值(48)与数值0
- 错误原因:将"数字字符"和"数值"概念混为一谈
- 正确做法:字符'0'的编码是48,字符'5'的编码是53。若要从字符得到数值,需减去48(或减去'0')
七、来源标注
- 依据2026考研统考大纲"计算机组成原理"第二章"数据的表示和运算"中"数制与编码"相关内容
- 依据大学本科经典教材共识(唐朔飞《计算机组成原理》、白中英《计算机组成原理》)
- BCD码编码规则参照GB/T标准
本知识单元为CO-02"数据的表示和运算"系列第1单元,下一单元将讲解定点数的编码表示。