目录

第三章:数据表示与编码


章节概述

本章介绍计算机中数据的表示方法,包括各种数制、数制转换、数值数据的编码(原码、反码、补码)、浮点数表示、字符编码和校验码等内容。理解数据在计算机中的表示是掌握计算机系统知识的基础。

本章重点

  1. 二进制、八进制、十六进制的表示和转换
  2. 原码、反码、补码的概念和计算
  3. 浮点数的IEEE 754标准
  4. ASCII码和Unicode编码

本章难点

  1. 补码的运算和溢出判断
  2. 浮点数的存储格式
  3. 海明码的原理

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,逢二进一。

特点

  1. 两个状态易于物理实现(如高低电平、有无磁性等)
  2. 运算规则简单
  3. 可靠性高

位权表示法

例如:$(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 原码表示法

定义:符号位加上数值的绝对值。

特点

  1. 简单直观
  2. 0有两种表示:+0(00000000)和-0(10000000)
  3. 加减运算复杂

表示范围(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 反码表示法

定义

  1. 正数的反码与原码相同
  2. 负数的反码:符号位不变,数值位按位取反

特点

  1. 0有两种表示:+0(00000000)和-0(11111111)
  2. 减法可以转换为加法
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. 正数的补码与原码相同
  2. 负数的补码:反码加1(或原码符号位不变,数值位取反加1)

特点

  1. 0只有一种表示
  2. 减法转换为加法,硬件实现简单
  3. 现代计算机普遍采用

表示范围(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}$

特点

  1. 保持了数据原有的大小顺序
  2. 便于比较大小
  3. 主要用于浮点数的阶码表示
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$

其中:

  1. S:符号位(0为正,1为负)
  2. M:尾数(有效数字)
  3. R:基数(通常为2)
  4. 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位十进制有效数字

特殊值

  1. E=0, M=0:±0
  2. E=255, M=0:±∞
  3. E=255, M≠0:NaN(非数)
  4. 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,美国信息交换标准代码)是最常用的字符编码。

特点

  1. 使用7位二进制表示,共128个字符
  2. 包括控制字符(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是全球统一的字符编码标准,为世界上几乎所有字符分配唯一的数字编号。

特点

  1. 统一编码,跨平台、跨语言
  2. 目前定义了超过100,000个字符
  3. 包含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的个数为奇数(奇校验)或偶数(偶校验)。

特点

  1. 能检测奇数位错误
  2. 不能检测偶数位错误
  3. 不能纠错
奇偶校验示例:

数据      奇校验      偶校验
─────────────────────────────
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是一种基于多项式除法的校验方法,广泛用于数据通信和存储。

原理:将数据视为一个多项式,除以生成多项式,余数作为校验码附加在数据后。

特点

  1. 检测能力强
  2. 实现简单(可用移位寄存器实现)
  3. 不能纠错

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