====== 第三章:数据表示与编码 ======
* [[#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}$
二进制与十进制对照表:
二进制 十进制 二进制 十进制 二进制 十进制
─────────────────────────────────────────────────────────────
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
==== 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,逢十六进一。
**与二进制的关系**:一位十六进制对应四位二进制
**应用**:广泛用于表示内存地址、颜色值、机器码等。
数制对照表:
十进制 二进制 八进制 十六进制
──────────────────────────────────────
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
====== 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}$ 转换为二进制
整数部分(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
==== 3.1.2.3 二进制与八进制、十六进制的转换 ======
**二进制转八进制**:整数部分从右向左每3位一组,小数部分从左向右每3位一组,不足补零。
**二进制转十六进制**:整数部分从右向左每4位一组,小数部分从左向右每4位一组,不足补零。
二进制 ↔ 八进制/十六进制示例:
二进制: 1011010.1101
转八进制:
001 011 010 . 110 100
1 3 2 . 6 4
结果:(132.64)8
转十六进制:
0101 1010 . 1101
5 A . D
结果:(5A.D)16
------
===== 3.2 数值数据的编码 =====
====== 3.2.1 机器数与真值 ======
**真值**:用正号、负号表示的数,如 +5、-7。
**机器数**:将符号数值化的数,用0表示正号,1表示负号。
真值与机器数示例:
真值 机器数(8位)
─────────────────────────
+5 0 0000101
-5 1 0000101
+127 0 1111111
-127 1 1111111
↑符号位(0为正,1为负)
====== 3.2.2 原码表示法 ======
**定义**:符号位加上数值的绝对值。
**特点**:
- 简单直观
- 0有两种表示:+0(00000000)和-0(10000000)
- 加减运算复杂
**表示范围**(n位):$-(2^{n-1}-1)$ 到 $+(2^{n-1}-1)$
8位原码示例:
十进制 原码(8位)
────────────────────
+0 00000000
-0 10000000
+1 00000001
-1 10000001
+127 01111111
-127 11111111
====== 3.2.3 反码表示法 ======
**定义**:
- 正数的反码与原码相同
- 负数的反码:符号位不变,数值位按位取反
**特点**:
- 0有两种表示:+0(00000000)和-0(11111111)
- 减法可以转换为加法
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)
====== 3.2.4 补码表示法 ======
**定义**:
- 正数的补码与原码相同
- 负数的补码:反码加1(或原码符号位不变,数值位取反加1)
**特点**:
- 0只有一种表示
- 减法转换为加法,硬件实现简单
- 现代计算机普遍采用
**表示范围**(n位):$-2^{n-1}$ 到 $+(2^{n-1}-1)$
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
**补码运算**:
补码加法示例:
计算 5 + (-3):
00000101 (+5补码)
+ 11111101 (-3补码)
───────────────
1 00000010 (进位舍弃)
结果:00000010 = +2 ✓
计算 (-5) + (-3):
11111011 (-5补码)
+ 11111101 (-3补码)
───────────────
1 11111000 (进位舍弃)
结果:11111000 → 取反加1 → 00001000 = -8 ✓
====== 3.2.5 移码表示法 ======
**定义**:在真值上加一个偏移量(常数)。n位移码的偏移量为 $2^{n-1}$。
**公式**:$[X]_{移} = 2^{n-1} + X$,其中 $-2^{n-1} \leq X < 2^{n-1}$
**特点**:
- 保持了数据原有的大小顺序
- 便于比较大小
- 主要用于浮点数的阶码表示
8位移码示例(偏移量128):
十进制 补码 移码
────────────────────────────
-128 10000000 00000000
-127 10000001 00000001
... ... ...
-1 11111111 01111111
0 00000000 10000000
+1 00000001 10000001
... ... ...
+127 01111111 11111111
------
===== 3.3 浮点数表示 =====
====== 3.3.1 浮点数表示格式 ======
浮点数用于表示实数,采用科学计数法的形式:$N = (-1)^S \times M \times R^E$
其中:
- S:符号位(0为正,1为负)
- M:尾数(有效数字)
- R:基数(通常为2)
- E:阶码(指数)
浮点数存储格式:
┌────────┬─────────────┬─────────────────┐
│ 符号 │ 阶码 │ 尾数 │
│ (S) │ (E) │ (M) │
└────────┴─────────────┴─────────────────┘
1位 k位 n位
====== 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位)====
单精度格式(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位十进制有效数字
**特殊值**:
- E=0, M=0:±0
- E=255, M=0:±∞
- E=255, M≠0:NaN(非数)
- E=0, M≠0:非规格化数
==== 3.3.3.2 双精度浮点数(64位)====
双精度格式(64位):
┌──────┬────────────────────────┬─────────────────────────────────────────────┐
│ S │ E(11位) │ M(52位) │
│ 1位 │ 偏移量1023 │ 隐含最高位1 │
└──────┴────────────────────────┴─────────────────────────────────────────────┘
计算公式:$N = (-1)^S \times 1.M \times 2^{E-1023}$
范围:约 ±2.23×10^-308 到 ±1.8×10^308
精度:约15-16位十进制有效数字
**示例**:将 -12.375 表示为IEEE 754单精度浮点数
步骤:
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
------
===== 3.4 非数值数据的编码 =====
====== 3.4.1 ASCII码 ======
**ASCII**(American Standard Code for Information Interchange,美国信息交换标准代码)是最常用的字符编码。
**特点**:
- 使用7位二进制表示,共128个字符
- 包括控制字符(0-31和127)和可打印字符(32-126)
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(空格)
**扩展ASCII**:使用8位表示,共256个字符,增加了一些欧洲语言的符号。
====== 3.4.2 Unicode编码 ======
**Unicode**是全球统一的字符编码标准,为世界上几乎所有字符分配唯一的数字编号。
**特点**:
- 统一编码,跨平台、跨语言
- 目前定义了超过100,000个字符
- 包含ASCII作为子集
**UTF-8编码**:Unicode的一种变长编码方式,与ASCII兼容。
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)
====== 3.4.3 汉字编码 ======
**GB2312**:中国国家标准,收录6763个汉字和682个非汉字图形字符,双字节编码。
**GBK**:对GB2312的扩展,收录21003个汉字,兼容GB2312。
**GB18030**:最新国家标准,收录27484个汉字,单字节、双字节、四字节编码。
**Big5**:台湾地区的繁体汉字编码。
------
===== 3.5 数据校验码 =====
====== 3.5.1 奇偶校验码 ======
**原理**:在数据位后增加一位校验位,使1的个数为奇数(奇校验)或偶数(偶校验)。
**特点**:
- 能检测奇数位错误
- 不能检测偶数位错误
- 不能纠错
奇偶校验示例:
数据 奇校验 偶校验
─────────────────────────────
1011001 10110010 10110011
(4个1) (偶数个1) (奇数个1)
1000000 10000001 10000000
(1个1) (偶数个1) (奇数个1)
====== 3.5.2 海明码 ======
**海明码**(Hamming Code)是一种可以纠正一位错误的编码。
**原理**:在数据位中插入多个校验位,每个校验位负责校验特定的位组合。
**校验位位置**:位于 $2^i$ 的位置(1, 2, 4, 8, 16...)
海明码示例(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)
====== 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