【嵌入式系统设计师(软考中级)】第一章:计算机系统基础知识(上)
文章目录
- 1. 数制及其转换
- 1.1 常用数制
- 1.2 不同数制间的转换方法(重点)
- ①八进制Q→ 十进制D
- ②十进制D → 八进制Q
- 2. 数据的表示
- 2.1 数值编码方式
- ①原码
- ②反码
- ③补码
- ④移码
- 2.2 定点数与浮点数(重点)
- ①定点数
- ②浮点数
- 2.3 非数值数据编码
- 2.4 校验方法
- ①奇偶校验(Parity Check)
- ②海明校验(Hamming Code)
- ③循环冗余校验(CRC, Cyclic Redundancy Check)
- 三种校验方法对比
1. 数制及其转换
1.1 常用数制
现代计算机系统主要使用四种数制:二进制(Binary)、八进制(Octal)、十进制(Decimal)和十六进制(Hexadecimal)。理解它们之间的转换是计算机科学的基础。以下是各种数制的说明
数制 | 十进制D | 二进制B | 八进制Q | 十六进制H |
---|---|---|---|---|
基本数码 | 0,1,2,3…9 | 0, 1 | 0,1,2,3,4…7 | 0-9,A,B,C,D,E,F |
基数 | r=10 | r=2 | r=8 | r=16 |
位权 | 10n | 2n | 8n | 16n |
形式表示符 | D | B | Q或O | H |
1.2 不同数制间的转换方法(重点)
在数制转换中,为了明确表示一个数值是基于哪种数制的,通常会在数值后加上形式表示符。以下是不同数制间的转换方法:
①八进制Q→ 十进制D
-
给定数值: 34 7 Q 347_Q 347Q
-
方法:使用按权展开法,将每一位乘以其对应的权值(基数的幂次),然后求和。
-
公式:
N D = d n × R n + d n − 1 × R n − 1 + ⋯ + d 0 × R 0 N_D = d_n \times R^n + d_{n-1} \times R^{n-1} + \dots + d_0 \times R^0 ND=dn×Rn+dn−1×Rn−1+⋯+d0×R0 -
步骤:
- 34 7 Q 347_Q 347Q表示八进制数,权值从右到左依次是 8 0 , 8 1 , 8 2 8^0, 8^1, 8^2 80,81,82。
- 展开计算:
34 7 Q = 3 × 8 2 + 4 × 8 1 + 7 × 8 0 = 3 × 64 + 4 × 8 + 7 × 1 = 192 + 32 + 7 = 23 1 D 347_Q = 3 \times 8^2 + 4 \times 8^1 + 7 \times 8^0 = 3 \times 64 + 4 \times 8 + 7 \times 1= 192 + 32 + 7 = 231_D 347Q=3×82+4×81+7×80=3×64+4×8+7×1=192+32+7=231D
-
结果:
34 7 Q = 23 1 D 347_Q = 231_D 347Q=231D
②十进制D → 八进制Q
-
给定数值: 23 1 D 231_D 231D
-
方法:使用短除法,不断将数值除以基数 R = 8 R=8 R=8,记录余数,直到商为 0。
-
步骤:
- 将 23 1 D 231_D 231D 除以 8,记录商和余数,重复操作直到商为 0。
除数 | 商 | 余数 |
---|---|---|
8 | 231 | 7 |
8 | 28 | 4 |
8 | 3 | 3 |
-
读取余数:从下往上读取余数,得到 34 7 Q 347_Q 347Q。
-
结果:
23 1 D = 34 7 Q 231_D = 347_Q 231D=347Q
2. 数据的表示
2.1 数值编码方式
在计算机系统中,数值通常以二进制形式存储和处理。为了表示有符号整数(包括正数、负数),引入了多种编码方式:原码、反码、补码和移码,每种编码方式都有其特点和适用场景:
①原码
定义与实例:原码是直接将数值转换为二进制,并在最高位使用0表示正数,1表示负数。例如,+5的8位二进制原码是00000101
,而-5的8位二进制原码是10000101
。
存在的问题:考虑计算 1 + ( − 1 ) 1 + (-1) 1+(−1),即 00000001
(1的原码) 加上 10000001
(-1的原码)。直接相加结果为 10000010
,其原码表示的是-2而不是期待的0,这表明直接用原码进行加减运算会导致错误的结果。
②反码
引入原因与实例:反码解决了部分原码的问题,它通过取负数的二进制形式的每一位的反来表示。对于+5,它的8位二进制反码同样是00000101
;对于-5,则是11111010
(先变为10000101
再取反)。
存在的问题:继续以 1 + ( − 1 ) 1 + (-1) 1+(−1)为例,00000001
(1的反码) 加上 11111110
(-1的反码) 得到 00000000
,但是还产生了额外的进位1
,需要特殊处理这个进位。此外,反码存在+0
和-0
两种表示方式,如00000000
和 11111111
,这增加了不必要的复杂性。
③补码
引入原因与实例:补码解决了反码中的问题,使得加减运算更加简便。正数的补码与原码相同,而负数的补码是在反码的基础上加1。例如,+5的8位二进制补码是00000101
,-5则是11111011
(反码11111010
加1)。
优势与实例:再次考虑 1 + ( − 1 ) 1 + (-1) 1+(−1),00000001
(1的补码) 加上 11111111
(-1的补码) 结果正好是00000000
,没有产生多余的进位,且正确地得到了0。补码统一了零的表示,解决了正负零的问题,简化了硬件设计。
④移码
引入原因与实例:移码主要用于浮点数表示中的指数部分,通过给定一个偏置值(Bias),将数值映射到正值范围以便于比较。例如,在IEEE 754标准中,单精度浮点数的指数部分采用8位表示,偏置值为127。若实际指数为-1,则其移码表示为127 - 1 = 126
,即01111110
。
应用示例:假设要比较两个浮点数的大小,由于指数部分已经通过移码转换成了无符号整数形式,可以直接根据其二进制表示判断大小,无需考虑正负号的影响。例如,指数值分别为01111110
(代表-1)和10000000
(代表1),显然,前者小于后者,便于排序和比较。
2.2 定点数与浮点数(重点)
①定点数
定义:定点数是一种数值表示法,其中小数点的位置是固定的。在计算机中,通常用固定数量的比特来表示整数部分和小数部分。例如,Q格式(如Q3.4)表示总共有8位,其中3位用于整数部分,4位用于小数部分,还有最高1位符号位(0
表示正数,1
表示负数)。
实例:将十进制数 5.75
转换为 Q3.4 格式的定点数
-
步骤1:首先将
5.75
转换为二进制形式。- 整数部分
5
的二进制表示为101
。 - 小数部分
0.75
的二进制表示为.11
(因为 0.75 = 1 ⋅ 2 − 1 + 1 ⋅ 2 − 2 0.75 =1·2^{-1} + 1·2^{-2} 0.75=1⋅2−1+1⋅2−2)。 - 因此,
5.75
的二进制表示为101.11
。
- 整数部分
-
步骤2:调整到 Q3.4 格式。
- Q3.4 表示有3位整数部分和4位小数部分,总共7位(假设不考虑符号位)。
- 扩展小数部分到4位:
101.1100
。
-
步骤3:考虑到符号位(这里我们处理正数),最终的Q3.4表示为:
0 101.1100
去掉小数点后写成:
01011100
这意味着,在Q3.4格式下,5.75
被表示为01011100
(其中最左边的0
是符号位,表示这是一个正数)。
问题:定点数的主要局限在于其动态范围有限且精度固定,不适合非常大或非常小的数值表示。
②浮点数
定义:浮点数是一种能够灵活表示很大范围数值的数据类型,它类似于科学计数法。IEEE 754标准定义了浮点数的标准格式,包括符号位、指数部分和尾数(也称作有效数字或小数部分)。单精度(32位)和双精度(64位)是最常见的两种浮点数格式。
实例:将十进制数 5.75
转换为 IEEE 754 单精度(32位)浮点数格式
-
步骤1:将
5.75
转换为二进制形式,并规范化为科学记数法。5.75
的二进制表示为101.11
。- 规范化为
1.0111 x 2^2
。
-
步骤2:确定指数偏置值(Bias)。
- 对于单精度浮点数,指数部分有8位,偏置值为127。
- 实际指数为2,因此加上偏置值后的指数为
2 + 127 = 129
,二进制表示为10000001
。
-
步骤3:确定尾数部分。
- 在规范化形式中,尾数部分只存储小数点后面的数字,即
0111
后面补零至23位,得到01110000000000000000000
。
- 在规范化形式中,尾数部分只存储小数点后面的数字,即
-
步骤4:结合符号位(这里是正数,所以符号位为0),最终的32位表示为:
0 10000001 01110000000000000000000 符号 指数 尾数
小结
- 定点数:适用于对精度要求高且数值范围不大的场景。例如,财务计算可能需要精确的小数位数控制。
- 浮点数:适合需要覆盖广泛数值范围的应用,特别是对于科学计算、图形处理等涉及极大或极小数值的领域。然而,浮点数可能会牺牲一些精度以换取更大的表示范围。
2.3 非数值数据编码
编码类型 | 具体标准/格式 | 特点说明 |
---|---|---|
字符编码 | ASCII | 7位编码,共128个字符,包含英文、数字及基本控制字符 |
字符编码 | Unicode | 统一字符集,涵盖全球文字符号,UTF-8是其变长编码实现(兼容ASCII) |
汉字编码 | GB2312 | 早期简体中文标准,收录6763个汉字,不支持生僻字 |
汉字编码 | GBK | GB2312扩展版,支持21886个汉字,包含繁体及生僻字 |
汉字编码 | GB18030 | 最新国家标准,覆盖70244个汉字,强制支持少数民族文字及生僻字 |
多媒体编码 | PCM(声音) | 原始音频采样格式,未压缩,保真度高(如CD音质) |
多媒体编码 | MP3(声音) | 有损压缩格式,通过去除人耳不敏感频段减小文件大小 |
多媒体编码 | BMP(图像) | 无压缩位图格式,存储原始像素数据,文件体积大 |
多媒体编码 | JPEG(图像) | 有损压缩格式,支持高压缩比,适合照片类图像 |
多媒体编码 | PNG(图像) | 无损压缩格式,支持透明通道,适合图标和线条图形 |
2.4 校验方法
①奇偶校验(Parity Check)
- 核心思想:通过增加1个校验位,使数据中
1
的个数为奇数(奇校验)或偶数(偶校验)。 - 实现步骤:
- 发送方统计数据位中
1
的个数。 - 根据校验类型(奇/偶)决定校验位值:
- 奇校验:
1
的总数+校验位=奇数 - 偶校验:
1
的总数+校验位=偶数
- 奇校验:
- 接收方重新计算并验证
1
的个数是否符合约定。
- 发送方统计数据位中
②海明校验(Hamming Code)
海明校验是一种可以检测并纠正单个比特错误的校验方法,它的核心思想是通过多个校验位交叉覆盖数据位,形成一种"错误定位编码"。
想象你要保护一串数据(比如4位数据 1011
),需要在其中插入几个"哨兵"(校验位)。这些哨兵的位置必须是2的幂次方(第1、2、4、8…位):
位置: 1 2 3 4 5 6 7
内容:P1 P2 D3 P4 D2 D1 D0
(P=校验位,D=数据位)
校验位计算方法
每个校验位负责"监视"特定位置的数据位:
- P1(位置1):检查所有位置编号第0位为1的位(即1,3,5,7…)
- P2(位置2):检查所有位置编号第1位为1的位(即2,3,6,7…)
- P4(位置4):检查所有位置编号第2位为1的位(即4,5,6,7…)
计算方式:对负责的所有位做**异或(XOR)**运算,结果作为校验位值。
实例演示(4位数据 1011
)
-
步骤1:插入校验位框架
位置:1 2 3 4 5 6 7 内容:_ _ 1 _ 0 1 1
-
步骤2:计算各校验位
- P1(管1,3,5,7):1⊕0⊕1 =
0
- P2(管2,3,6,7):1⊕1⊕1 =
1
- P4(管4,5,6,7):0⊕1⊕1 =
0
- P1(管1,3,5,7):1⊕0⊕1 =
-
最终编码:
位置:1 2 3 4 5 6 7 内容:0 1 1 0 0 1 1
关键点总结
- 校验位位置:必须放在2的幂次方位(1,2,4,8…)
- 覆盖规则:每个校验位监控特定组合的数据位
- 纠错能力:可100%纠正单比特错误,检测双比特错误
- 校验位数量:满足 2 r ≥ k + r + 1 2^r \geq k + r + 1 2r≥k+r+1( k k k=数据位数)
③循环冗余校验(CRC, Cyclic Redundancy Check)
-
基本原理
- 核心思想:将数据视为二进制多项式,通过模2除法生成校验码。
- 关键参数:生成多项式(如CRC-16: x 16 + x 15 + x 2 + 1 x^{16} + x^{15} + x^2 + 1 x16+x15+x2+1)。
-
计算步骤
- 在数据位后附加
n
个0
( n n n=生成多项式最高次幂)。 - 用生成多项式对扩展后的数据做模2除法。
- 余数作为CRC校验码附加到原始数据后。
- 在数据位后附加
-
示例(简化版)
数据:110101
,生成多项式: x 3 + x + 1 x^3 + x + 1 x3+x+1(1011
)- 附加3个
0
→110101000
- 模2除法:
110101000⊕ 1011--------11000⊕ 1011--------1110 ← 余数`110`
- 发送数据:
110101
+110
- 附加3个
三种校验方法对比
特性 | 奇偶校验 | 海明校验 | CRC校验 |
---|---|---|---|
检错能力 | 单比特 | 单/双比特 | 多比特突发错误 |
纠错能力 | ❌ | ✅(单比特) | ❌ |
校验位开销 | 1位 | log 2 ( k ) \log_2(k) log2(k)位 | 16/32位 |
计算复杂度 | 极低 | 中等 | 较高 |
典型应用 | 串口通信 | ECC内存 | 网络数据包 |
应用场景建议
- 简单通信:奇偶校验(如UART)
- 关键存储:海明码(如RAM纠错)
- 大数据传输:CRC(如TCP/IP协议栈)