显示页面讨论过去修订反向链接回到顶部 本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。 ====== 第三章:数据表示与编码 ====== * [[#3.1 数制与数制转换|3.1 数制与数制转换]] * [[#3.2 数值数据的编码|3.2 数值数据的编码]] * [[#3.3 浮点数表示|3.3 浮点数表示]] * [[#3.4 非数值数据的编码|3.4 非数值数据的编码]] * [[#3.5 数据校验码|3.5 数据校验码]] * [[#3.6 练习题|3.6 练习题]] ---- ===== 章节概述 ===== 本章介绍计算机中数据的表示方法,包括各种数制、数制转换、数值数据的编码(原码、反码、补码)、浮点数表示、字符编码和校验码等内容。理解数据在计算机中的表示是掌握计算机系统知识的基础。 **本章重点**: - 二进制、八进制、十六进制的表示和转换 - 原码、反码、补码的概念和计算 - 浮点数的IEEE 754标准 - ASCII码和Unicode编码 **本章难点**: - 补码的运算和溢出判断 - 浮点数的存储格式 - 海明码的原理 ---- ===== 3.1 数制与数制转换 ===== ====== 3.1.1 常用数制 ====== 计算机内部使用二进制表示数据,但为了便于人类阅读和书写,常使用八进制和十六进制作为二进制的缩写形式。 ==== 3.1.1.1 十进制(Decimal)==== 十进制是人们日常生活中最常用的数制,使用0-9十个数字符号,基数为10,逢十进一。 **位权表示法**: 例如:$(123.45)_{10} = 1 \times 10^2 + 2 \times 10^1 + 3 \times 10^0 + 4 \times 10^{-1} + 5 \times 10^{-2}$ ==== 3.1.1.2 二进制(Binary)==== 二进制是计算机内部使用的数制,只使用0和1两个数字符号,基数为2,逢二进一。 **特点**: - 两个状态易于物理实现(如高低电平、有无磁性等) - 运算规则简单 - 可靠性高 **位权表示法**: 例如:$(1011.01)_2 = 1 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0 + 0 \times 2^{-1} + 1 \times 2^{-2}$ $= 8 + 0 + 2 + 1 + 0 + 0.25 = (11.25)_{10}$ <code> 二进制与十进制对照表: 二进制 十进制 二进制 十进制 二进制 十进制 ───────────────────────────────────────────────────────────── 0000 0 0101 5 1010 10 0001 1 0110 6 1011 11 0010 2 0111 7 1100 12 0011 3 1000 8 1101 13 0100 4 1001 9 1110 14 1111 15 </code> ==== 3.1.1.3 八进制(Octal)==== 八进制使用0-7八个数字符号,基数为8,逢八进一。 **与二进制的关系**:一位八进制对应三位二进制 **应用**:早期计算机系统中常用于简化二进制表示,现较少使用。 ==== 3.1.1.4 十六进制(Hexadecimal)==== 十六进制使用0-9和A-F十六个符号(A=10, B=11, C=12, D=13, E=14, F=15),基数为16,逢十六进一。 **与二进制的关系**:一位十六进制对应四位二进制 **应用**:广泛用于表示内存地址、颜色值、机器码等。 <code> 数制对照表: 十进制 二进制 八进制 十六进制 ────────────────────────────────────── 0 0000 00 0 1 0001 01 1 2 0010 02 2 3 0011 03 3 4 0100 04 4 5 0101 05 5 6 0110 06 6 7 0111 07 7 8 1000 10 8 9 1001 11 9 10 1010 12 A 11 1011 13 B 12 1100 14 C 13 1101 15 D 14 1110 16 E 15 1111 17 F </code> ====== 3.1.2 数制转换 ====== ==== 3.1.2.1 其他进制转十进制 ====== **方法**:按位权展开求和 **示例1**:将二进制 $(1101.01)_2$ 转换为十进制 $(1101.01)_2 = 1 \times 2^3 + 1 \times 2^2 + 0 \times 2^1 + 1 \times 2^0 + 0 \times 2^{-1} + 1 \times 2^{-2}$ $= 8 + 4 + 0 + 1 + 0 + 0.25 = (13.25)_{10}$ **示例2**:将十六进制 $(2A.8)_{16}$ 转换为十进制 $(2A.8)_{16} = 2 \times 16^1 + 10 \times 16^0 + 8 \times 16^{-1}$ $= 32 + 10 + 0.5 = (42.5)_{10}$ ==== 3.1.2.2 十进制转二进制 ====== **整数部分**:除2取余,逆序排列 **小数部分**:乘2取整,顺序排列 **示例**:将十进制 $(25.375)_{10}$ 转换为二进制 <code> 整数部分(25): 余数 25 ÷ 2 = 12 ... 1 ↑ 12 ÷ 2 = 6 ... 0 │ 6 ÷ 2 = 3 ... 0 │ 逆序排列 3 ÷ 2 = 1 ... 1 │ 1 ÷ 2 = 0 ... 1 ↓ 结果:(25)10 = (11001)2 小数部分(0.375): 整数 0.375 × 2 = 0.75 ... 0 ↓ 0.75 × 2 = 1.5 ... 1 │ 顺序排列 0.5 × 2 = 1.0 ... 1 ↑ 结果:(0.375)10 = (0.011)2 最终结果:(25.375)10 = (11001.011)2 </code> ==== 3.1.2.3 二进制与八进制、十六进制的转换 ====== **二进制转八进制**:整数部分从右向左每3位一组,小数部分从左向右每3位一组,不足补零。 **二进制转十六进制**:整数部分从右向左每4位一组,小数部分从左向右每4位一组,不足补零。 <code> 二进制 ↔ 八进制/十六进制示例: 二进制: 1011010.1101 转八进制: 001 011 010 . 110 100 1 3 2 . 6 4 结果:(132.64)8 转十六进制: 0101 1010 . 1101 5 A . D 结果:(5A.D)16 </code> ------ ===== 3.2 数值数据的编码 ===== ====== 3.2.1 机器数与真值 ====== **真值**:用正号、负号表示的数,如 +5、-7。 **机器数**:将符号数值化的数,用0表示正号,1表示负号。 <code> 真值与机器数示例: 真值 机器数(8位) ───────────────────────── +5 0 0000101 -5 1 0000101 +127 0 1111111 -127 1 1111111 ↑符号位(0为正,1为负) </code> ====== 3.2.2 原码表示法 ====== **定义**:符号位加上数值的绝对值。 **特点**: - 简单直观 - 0有两种表示:+0(00000000)和-0(10000000) - 加减运算复杂 **表示范围**(n位):$-(2^{n-1}-1)$ 到 $+(2^{n-1}-1)$ <code> 8位原码示例: 十进制 原码(8位) ──────────────────── +0 00000000 -0 10000000 +1 00000001 -1 10000001 +127 01111111 -127 11111111 </code> ====== 3.2.3 反码表示法 ====== **定义**: - 正数的反码与原码相同 - 负数的反码:符号位不变,数值位按位取反 **特点**: - 0有两种表示:+0(00000000)和-0(11111111) - 减法可以转换为加法 <code> 8位反码示例: 十进制 原码 反码 ───────────────────────────── +5 00000101 00000101 -5 10000101 11111010 +0 00000000 00000000 -0 10000000 11111111 +127 01111111 01111111 -127 11111111 10000000 计算示例: 00000101 (+5) + 11111010 (-5反码) ─────────────── 11111111 (-0) </code> ====== 3.2.4 补码表示法 ====== **定义**: - 正数的补码与原码相同 - 负数的补码:反码加1(或原码符号位不变,数值位取反加1) **特点**: - 0只有一种表示 - 减法转换为加法,硬件实现简单 - 现代计算机普遍采用 **表示范围**(n位):$-2^{n-1}$ 到 $+(2^{n-1}-1)$ <code> 8位补码示例: 十进制 原码 反码 补码 ──────────────────────────────────────── +5 00000101 00000101 00000101 -5 10000101 11111010 11111011 +0 00000000 00000000 00000000 -0 10000000 11111111 00000000 +127 01111111 01111111 01111111 -127 11111111 10000000 10000001 -128 不存在 不存在 10000000 </code> **补码运算**: <code> 补码加法示例: 计算 5 + (-3): 00000101 (+5补码) + 11111101 (-3补码) ─────────────── 1 00000010 (进位舍弃) 结果:00000010 = +2 ✓ 计算 (-5) + (-3): 11111011 (-5补码) + 11111101 (-3补码) ─────────────── 1 11111000 (进位舍弃) 结果:11111000 → 取反加1 → 00001000 = -8 ✓ </code> ====== 3.2.5 移码表示法 ====== **定义**:在真值上加一个偏移量(常数)。n位移码的偏移量为 $2^{n-1}$。 **公式**:$[X]_{移} = 2^{n-1} + X$,其中 $-2^{n-1} \leq X < 2^{n-1}$ **特点**: - 保持了数据原有的大小顺序 - 便于比较大小 - 主要用于浮点数的阶码表示 <code> 8位移码示例(偏移量128): 十进制 补码 移码 ──────────────────────────── -128 10000000 00000000 -127 10000001 00000001 ... ... ... -1 11111111 01111111 0 00000000 10000000 +1 00000001 10000001 ... ... ... +127 01111111 11111111 </code> ------ ===== 3.3 浮点数表示 ===== ====== 3.3.1 浮点数表示格式 ====== 浮点数用于表示实数,采用科学计数法的形式:$N = (-1)^S \times M \times R^E$ 其中: - S:符号位(0为正,1为负) - M:尾数(有效数字) - R:基数(通常为2) - E:阶码(指数) <code> 浮点数存储格式: ┌────────┬─────────────┬─────────────────┐ │ 符号 │ 阶码 │ 尾数 │ │ (S) │ (E) │ (M) │ └────────┴─────────────┴─────────────────┘ 1位 k位 n位 </code> ====== 3.3.2 规格化 ====== **规格化形式**:尾数的最高位为1(对于二进制)。 例如:$0.01101 \times 2^3$ 规格化为 $0.1101 \times 2^2$ **目的**:保证表示的唯一性,提高精度。 ====== 3.3.3 IEEE 754标准 ====== IEEE 754是浮点数的国际标准,定义了单精度和双精度两种格式。 ==== 3.3.3.1 单精度浮点数(32位)==== <code> 单精度格式(32位): ┌──────┬───────────────────────┬──────────────────────────────────────┐ │ S │ E(8位) │ M(23位) │ │ 1位 │ 偏移量127 │ 隐含最高位1 │ └──────┴───────────────────────┴──────────────────────────────────────┘ 计算公式:$N = (-1)^S \times 1.M \times 2^{E-127}$ 范围:约 ±1.18×10^-38 到 ±3.4×10^38 精度:约7位十进制有效数字 </code> **特殊值**: - E=0, M=0:±0 - E=255, M=0:±∞ - E=255, M≠0:NaN(非数) - E=0, M≠0:非规格化数 ==== 3.3.3.2 双精度浮点数(64位)==== <code> 双精度格式(64位): ┌──────┬────────────────────────┬─────────────────────────────────────────────┐ │ S │ E(11位) │ M(52位) │ │ 1位 │ 偏移量1023 │ 隐含最高位1 │ └──────┴────────────────────────┴─────────────────────────────────────────────┘ </code> 计算公式:$N = (-1)^S \times 1.M \times 2^{E-1023}$ <code> 范围:约 ±2.23×10^-308 到 ±1.8×10^308 精度:约15-16位十进制有效数字 </code> **示例**:将 -12.375 表示为IEEE 754单精度浮点数 <code> 步骤: 1. 转换为二进制:-12.375 = -1100.011 2. 规格化:-1.100011 × 2^3 3. 符号位 S = 1(负数) 4. 阶码 E = 3 + 127 = 130 = 10000010 5. 尾数 M = 10001100000000000000000 结果: 1 10000010 10001100000000000000000 十六进制:0xC1460000 </code> ------ ===== 3.4 非数值数据的编码 ===== ====== 3.4.1 ASCII码 ====== **ASCII**(American Standard Code for Information Interchange,美国信息交换标准代码)是最常用的字符编码。 **特点**: - 使用7位二进制表示,共128个字符 - 包括控制字符(0-31和127)和可打印字符(32-126) <code> ASCII码表(部分): 十进制 字符 十进制 字符 十进制 字符 十进制 字符 ──────────────────────────────────────────────────────────────────── 48 '0' 65 'A' 97 'a' 49 '1' 66 'B' 98 'b' ... ... ... ... ... ... 57 '9' 90 'Z' 122 'z' 重要控制字符: 0 NUL(空) 9 TAB(制表) 10 LF(换行) 13 CR(回车) 27 ESC(退出) 32 SP(空格) </code> **扩展ASCII**:使用8位表示,共256个字符,增加了一些欧洲语言的符号。 ====== 3.4.2 Unicode编码 ====== **Unicode**是全球统一的字符编码标准,为世界上几乎所有字符分配唯一的数字编号。 **特点**: - 统一编码,跨平台、跨语言 - 目前定义了超过100,000个字符 - 包含ASCII作为子集 **UTF-8编码**:Unicode的一种变长编码方式,与ASCII兼容。 <code> UTF-8编码规则: Unicode范围 UTF-8字节序列 ───────────────────────────────────────── U+0000 ~ U+007F 0xxxxxxx U+0080 ~ U+07FF 110xxxxx 10xxxxxx U+0800 ~ U+FFFF 1110xxxx 10xxxxxx 10xxxxxx U+10000 ~ U+10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 示例: 'A' (U+0041) → 01000001 '中' (U+4E2D) → 11100100 10111000 10101101 (E4 B8 AD) </code> ====== 3.4.3 汉字编码 ====== **GB2312**:中国国家标准,收录6763个汉字和682个非汉字图形字符,双字节编码。 **GBK**:对GB2312的扩展,收录21003个汉字,兼容GB2312。 **GB18030**:最新国家标准,收录27484个汉字,单字节、双字节、四字节编码。 **Big5**:台湾地区的繁体汉字编码。 ------ ===== 3.5 数据校验码 ===== ====== 3.5.1 奇偶校验码 ====== **原理**:在数据位后增加一位校验位,使1的个数为奇数(奇校验)或偶数(偶校验)。 **特点**: - 能检测奇数位错误 - 不能检测偶数位错误 - 不能纠错 <code> 奇偶校验示例: 数据 奇校验 偶校验 ───────────────────────────── 1011001 10110010 10110011 (4个1) (偶数个1) (奇数个1) 1000000 10000001 10000000 (1个1) (偶数个1) (奇数个1) </code> ====== 3.5.2 海明码 ====== **海明码**(Hamming Code)是一种可以纠正一位错误的编码。 **原理**:在数据位中插入多个校验位,每个校验位负责校验特定的位组合。 **校验位位置**:位于 $2^i$ 的位置(1, 2, 4, 8, 16...) <code> 海明码示例(4位数据,3位校验位): 位置: 1 2 3 4 5 6 7 P1 P2 D1 P3 D2 D3 D4 ↑ ↑ ↑ 校验位 校验位 校验关系: P1 = D1 ⊕ D2 ⊕ D4(位置3,5,7) P2 = D1 ⊕ D3 ⊕ D4(位置3,6,7) P3 = D2 ⊕ D3 ⊕ D4(位置5,6,7) </code> ====== 3.5.3 循环冗余校验(CRC)====== **CRC**是一种基于多项式除法的校验方法,广泛用于数据通信和存储。 **原理**:将数据视为一个多项式,除以生成多项式,余数作为校验码附加在数据后。 **特点**: - 检测能力强 - 实现简单(可用移位寄存器实现) - 不能纠错 ------ ===== 3.6 练习题 ===== ==== 一、选择题 ==== 1. 将十进制数25转换为二进制,结果是( ) A. 10111 B. 11001 C. 10011 D. 11101 2. 8位补码表示的范围是( ) A. -127 ~ +127 B. -128 ~ +127 C. -127 ~ +128 D. -128 ~ +128 3. 下列编码中,0的表示唯一的是( ) A. 原码 B. 反码 C. 补码 D. 移码 4. IEEE 754单精度浮点数的阶码偏移量是( ) A. 127 B. 128 C. 255 D. 256 5. ASCII码使用( )位表示一个字符 A. 4 B. 7 C. 8 D. 16 ==== 二、填空题 ==== 1. 二进制数101101.11转换为十进制是_______。 2. 十进制数-15的8位补码是_______。 3. 十六进制数A3.5转换为二进制是_______。 4. 浮点数由_______、_______和_______三部分组成。 5. 奇偶校验可以检测_______位错误,海明码可以纠正_______位错误。 ==== 三、计算题 ==== 1. 将十进制数125.625转换为二进制、八进制和十六进制。 2. 已知X = +1011,Y = -0101,用8位补码计算X + Y和X - Y。 3. 将-28.5表示为IEEE 754单精度浮点数(用十六进制表示)。 4. 设生成多项式G(x) = x³ + x + 1,数据为1011,计算CRC校验码。 ==== 四、简答题 ==== 1. 简述原码、反码、补码的区别和各自的特点。 2. 为什么要对浮点数进行规格化?IEEE 754标准是如何实现规格化的? 3. 简述海明码的基本原理。 ---- **参考答案**: 一、选择题:1.B 2.B 3.C 4.A 5.B 二、填空题: 1. 45.75 2. 11110001 3. 10100011.0101 4. 符号位、阶码、尾数 5. 奇数、1 登录 Detach Close 该主题尚不存在 您访问的页面并不存在。如果允许,您可以使用创建该页面按钮来创建它。 计算机操作系统/第三章_数据表示与编码.txt 最后更改: 2026/02/09 23:21由 张叶安 登录