计算机科学概论 · COMPUTER SCIENCE: AN OVERVIEW

第1章
数据存储

Data Storage | 一切信息,皆为 0 与 1

在最底层,计算机中所有的信息都被编码为 0 和 1 的位模式——本章回答两个问题:位如何存储?位如何表示信息?

教材:J. Glenn Brookshear《Computer Science: An Overview》(第13版)
授课对象:大学一年级 | 每节含小结与课堂练习(单选题,A / B / C / D)
硬盘内部盘片与读写磁头
硬盘内部的盘片与读/写磁头(Wikipedia: Disk read-and-write head)
SCROLL ↓
00
本章导览 · LEARNING MAP

三条主线:位如何存、信息如何编码、数据如何可靠

主线对应章节核心问题
位的存储1.1 – 1.3布尔运算、触发器、主存与海量存储——硬件如何记住 0 和 1?
位的表示1.4 – 1.7文本、数值、图像、声音如何编码为位模式?
数据的应用1.8 – 1.10压缩与差错控制如何让数据够用、可靠?

课堂练习:每节 2 题单选(共 20 题),点击选项即刻判分并显示解析;全部答案汇总于页面末尾「参考答案」。

总进度 已完成 0 / 20 | 答对 0
1.1
1.1 位和位存储 · BITS AND BIT STORAGE

位:一切信息的最小符号

本节小结 位(bit,binary digit)是取值 0 或 1 的符号,所有信息都以位模式(bit pattern)编码。布尔运算 AND / OR / XOR / NOT 处理真/假值;门(gate)是实现布尔运算的设备,触发器(flip-flop)是由门构成、能存 1 个位的电路;十六进制记数法用一个符号代替 4 个位,是给人看的二进制简写。

四种布尔运算

假设 0 表示假(false)、1 表示真(true)。为纪念逻辑数学先驱乔治·布尔(George Boole,1815—1864),处理真/假值的运算称为布尔运算。AND 仅当两输入都为 1 才输出 1;OR 至少一个为 1 即输出 1;XOR 在两输入不同时输出 1;NOT 只有一个输入,输出与输入相反。

PQP AND QP OR QP XOR Q
00000
01011
10011
11110

十六进制:一个符号 = 4 个位

长位串难以抄录,十六进制记数法(hexadecimal notation)用 0~9、A~F 共 16 个符号各表示 4 个位,本书用前缀“0x”标记:

1011 0101 → 0xB5  1010 0100 1100 1000 → 0xA4C8

动手试一试:二进制 ↔ 十六进制 / 十进制转换器

十六进制 0xB5 | 十进制 181

提示:从右往左每 4 位分一段,逐段查表替换即得十六进制。

乔治·布尔
乔治·布尔(1815—1864),逻辑数学先驱,布尔运算因他得名(Science Photo Library)
电路板上的晶体管
今天的“门”主要由晶体管制造(Shutterstock)
位的含义取决于应用:同一串 01000001,按 ASCII 是字符 'A',按二进制数值是 65。
§1.1课堂练习
Q1下列关于 XOR(异或)运算的描述,正确的是?
A两个输入都为 1 时输出 1
B两个输入不同时输出 1
C至少一个输入为 1 时输出 1
D只有一个输入,输出与输入相反
XOR 意为“或者是 P,或者是 Q,但不会两个共存”——两输入不同时输出 1。A 是 AND,C 是 OR,D 是 NOT。
Q2位模式 0100 1000 用十六进制记数法表示为?
A0x44
B0x84
C0x48
D0x24
分段 0100 | 1000,0100→4,1000→8,故为 0x48。
1.2
1.2 主存储器 · MAIN MEMORY

可编址的字节单元,支持随机存取

本节小结 主存储器由可编址的存储单元(cell)组成,典型单元存 8 位 = 1 字节(byte);每个单元有唯一数值地址(address),从 0 开始编号,可按地址读(read)/写(write)。因为能以任意顺序访问任一单元,主存又称随机存取存储器(RAM);现代 RAM 多为动态存储器(DRAM),靠刷新电路每秒多次补充微小电荷。容量以 KB / MB / GB / TB 度量(千、兆在计算机语境中表示 2 的幂)。

字节型存储单元的组织(点击翻转每一位)

01000001
高位端 MSB(最高有效位)低位端 LSB(最低有效位)

当前字节按二进制解释为:65(也可读作 ASCII 字符 'A')。

三个关键术语

RAM(Random Access Memory,随机存取存储器):由独立、可编址的单元组成,可按任意顺序访问——与海量存储“按块读写”形成对比。

DRAM(Dynamic RAM,动态存储器):把位存储为微小而快速消散的电荷,需要刷新电路反复补充,因此具有易失性。

SDRAM(Synchronous DRAM,同步动态存储器):采用附加同步技术,缩短从存储单元中取数的时间。

容量度量

单位习惯含义
KB 千字节1024 B(2¹⁰)
MB 兆字节1024 KB
GB 吉字节1024 MB
TB 太字节1024 GB

“千、兆”本是 1000 的幂;国际标准另立 kibi- / mebi- / gibi- / tebi- 专指 1024 的幂,但习惯用法仍流行——阅读时注意语境。

“单元 + 地址 + 随机存取”——理解一切内存操作的三要素。
§1.2课堂练习
Q3计算机的主存储器常被称为 RAM,其“随机存取”的含义是?
A存储单元的地址是随机分配的
B可以按任意顺序独立访问各个存储单元
C存入的数据会随机丢失
D只能随机读取,不能写入
主存由独立、可编址的单元组成,用任何顺序访问任一单元的能力,正是“随机存取”的含义。
Q4一台带 4 KB 存储器的计算机,其存储器里有多少个二进制位?
A4 × 1024 × 8 = 32 768 位
B4 × 1000 × 8 = 32 000 位
C4 × 1024 = 4 096 位
D4 × 8 = 32 位
KB 按 1024 字节计,每字节 8 位:4 × 1024 = 4 096 个单元,4 096 × 8 = 32 768 位。
1.3
1.3 海量存储器 · MASS STORAGE

用更大的容量与持久性,换更慢的速度

本节小结 为弥补主存的易失性与容量限制,计算机配备海量存储(mass storage,二级存储):磁盘(HDD)在旋转盘片的磁介质上按磁道/扇区记录;光盘(CD/DVD/BD)以反射层偏差记录,螺旋磁道由内向外;闪存(flash memory)与固态驱动器(SSD)用二氧化硅晶格截获电子,无运动部件;磁带低成本、线性读写,适合归档备份。衡量磁盘性能的指标:寻道时间、旋转延迟、存取时间、传输速率(以及通用的带宽与等待时间)。

四类系统对比

系统记录原理特点
磁盘 HDD磁介质涂层机械旋转 + 磁头移动,毫秒级;TB 级联机大容量
光盘 CD/DVD/BD反射层偏差,激光检测螺旋磁道,长于连续读取;多层 BD 可达 100 GB
闪存 / SSD晶格截获电子全电子、防震抗摔;反复擦写会损耗,SSD 以耗损均衡缓解
磁带塑料带磁涂层等待时间极长,但低成本、大容量,适合线性读写的归档备份

数量级对比:主存的工作以纳秒(10⁻⁹ 秒)计,机械存储系统的寻道与等待以毫秒(10⁻³ 秒)计——相差约百万倍。

硬盘读写磁头组
多盘片系统的读/写磁头组,所有磁头一起移动——同位磁道构成柱面(EXALAB)
光盘表面对光的衍射
光盘的信息记录在一条由内向外的螺旋磁道上(Alamy)
固态驱动器
固态驱动器(SSD)无运动部件,正在取代便携设备中的磁硬盘(Shutterstock)
早期磁带机
早期计算机的磁带机;磁带至今仍是低成本归档的选择(University of Auckland)
存取时间 = 寻道时间 + 旋转延迟——磁盘的一切优化,本质上都是与机械运动作斗争。
§1.3课堂练习
Q5磁盘系统的“存取时间(access time)”是指?
A盘片旋转一周所需的时间
B数据传入或传出磁盘的速率
C磁头从一个磁道移到另一个磁道的时间
D寻道时间与旋转延迟之和
教材定义的四项指标:寻道时间、旋转延迟(约等于盘片转半周)、存取时间 = 前两者之和、传输速率。
Q6相对于磁系统与光系统,闪存驱动器的主要优势是?
A容量永远更大
B可以无限次擦写
C没有运动部件,防震抗摔、存取更快
D适合真正的长期存档
闪存全电子化,不怕物理震动,但反复擦除会损坏晶格(寿命有限),也不如光盘适合长期存档。
1.4
1.4 用位模式表示信息 · REPRESENTING INFORMATION

文本、数值、图像、声音,如何变成 0 和 1?

本节小结 文本:ASCII 用 7(后扩展为 8)位模式表示每个符号;Unicode 为每个符号规定唯一的 21 位模式,配合 UTF-8 可兼容 ASCII 并容纳世界各语言。数值:二进制记数法远比逐字符编码高效(16 位可表示 0~65 535)。图像:位图按像素(pixel)编码,彩色常用 RGB(每像素 3 字节);几何结构表示(TrueType、CAD)可自由缩放。声音:按固定间隔采样振幅(CD 音质 44 100 次/秒、每次 16 位);MIDI 编码演奏指令而非声音本身。

例:“Hello.” 的 ASCII / UTF-8 编码

H   e   l   l   o   .
01001000 01100101 01101100 01101100 01101111 00101110

图像:位图 vs 几何结构

位图把图像看作像素网格:黑白每像素 1 位、灰度 8 位、彩色 RGB 共 3 字节;缺点是放大即模糊(“数字变焦”)。几何表示用直线与曲线描述形状,字体(TrueType / PostScript)和 CAD 因此能任意缩放而保持清晰。

声音:采样序列还原波形(动画演示)

教材图 1-12 示例:采样序列 0、1.5、2.0、1.5、2.0、3.0、4.0、3.0、0 —— 逐点绘制后连成波形。

屏幕像素特写
显示屏的像素阵列特写——位图图像正是逐像素编码(Shutterstock)
示波器显示声波
麦克风把声波转为电信号,示波器上呈现波形;采样即按固定间隔记录振幅(Science Photo Library)

MIDI 对比:单簧管演奏 D 音符 2 秒,MIDI 编码仅需 3 字节;按 44 100 次/秒采样则需两百多万个二进制位

编码是一种“约定”:同一串位,按文本、数值、图像或声音的约定解释,得到完全不同的信息。
§1.4课堂练习
Q7若每个字符用 1 字节 ASCII 编码,3 字节最多能表示的数值是多少?若改用二进制记数法呢?
A999 与 16 777 215
B99 与 65 535
C999 与 65 535
D255 与 16 777 215
逐字符存 3 位十进制数字最大为 999;24 位二进制可表示 0 ~ 2²⁴−1 = 16 777 215——这正是二进制记数法的效率优势。
Q8关于 MIDI(乐器数字化接口),下列说法正确的是?
A按每秒 44 100 次对声波采样
B编码的是音乐本身,任何设备播放效果相同
C是一种图像压缩标准
D编码“什么乐器演奏什么音符、持续多久”的指令,类似记录乐谱
MIDI 编码演奏指令而非声音本身,因此存储量极小,但同一份 MIDI 在不同合成器上播放的声音可能截然不同。
1.5
1.5 二进制系统 · THE BINARY SYSTEM

每一位的量值,是它右边的 2 倍

本节小结 二进制记数法中,从右向左各位量值依次为 1、2、4、8……解码即求“数字为 1 的位置”的量值之和;求大数的二进制表示可用除 2 取余算法。二进制加法与十进制同法,只是“逢二进一”;基数小数点(radix point)右边的位依次表示 1/2、1/4、1/8……使二进制也能表示分数。

解码 100101 = 37

100101
量值32168421

32 + 4 + 1 = 37。带小数点的例子:101.101 = 4 + 1 + 1/2 + 1/8 = 5.625

除 2 取余:13 → 1101

13 ÷ 2 = 6 … 余 1  6 ÷ 2 = 3 … 余 0
3 ÷ 2 = 1 … 余 1  1 ÷ 2 = 0 … 余 1
余数自下而上读 → 1101

动手试一试:十进制 → 二进制(含过程)

13÷2=6…1
6÷2=3…0
3÷2=1…1
1÷2=0…1
→ 1101

二进制加法法则:0+0=0,1+0=1,1+1=10,1+1+1=11。

记数法只是“外衣”:010+010=100、2+2=4、0x2+0x2=0x4,是同一个底层数量。
§1.5课堂练习
Q9二进制表示 1011 对应的十进制值是?
A9
B11
C13
D3
三个 1 分别在量值 8、2、1 的位置上:8 + 2 + 1 = 11。
Q10二进制加法 10.011 + 100.11 的结果是?
A110.101
B111.101
C111.001
D110.011
对齐基数小数点后逐列相加(逢二进一):10.011 + 100.110 = 111.001。
1.6
1.6 整数的存储 · STORING INTEGERS

二进制补码:一套加法电路,同时解决减法

本节小结 二进制补码(two's complement)用固定位数表示整数:最左的符号位(sign bit)为 0 表示非负、1 表示负;4 位系统可表示 −8 ~ +7。求相反数:从右复制到第一个 1(含),其余位取反。加法和减法共用同一算法——7 − 5 = 7 + (−5)。固定位数带来溢出(overflow):结果超出可表示范围(如 5 + 4 显示为 −7),可用符号位异常检测。余码记数法(excess notation)以“最高位为 1 的首个模式”表示 0,常用于浮点的指数域。

4 位补码系统一览

位模式位模式
0111+7(最大)1111−1
0100+41100−4
0001+11001−7
000001000−8(最小)

减法即加法:7 − 5

0111(7)+ 1011(−5)= 10010
截去最高进位 → 0010 = 2 ✓

余 8 记数法对照:1000 表示 0,1101 表示 +5,0011 表示 −5——符号位与补码恰好相反。

溢出的真实代价

1989 年 9 月 19 日,一家医院多年来运行良好的计算机突然故障。原因:程序用 16 位补码记录距 1900 年 1 月 1 日的天数,那天恰好是第 32 768 天——超出 16 位补码最大正值 32 767,日期变成了负数。

启示:使用机器的人必须意识到“较小的值会累加成较大的值”。现今普遍使用 32 位补码(最大正值 2 147 483 647)。

小学生先学加法后学减法;用补码记数法的机器只需知道如何相加。
§1.6课堂练习
Q11在 4 位二进制补码系统中,位模式 1010 表示的十进制值是?
A10
B−2
C2
D−6
符号位为 1 表示负值;对 1010 做“复制+取反”得 0110 = 6,故原模式表示 −6。
Q12用 4 位补码计算 5 + 4,结果及原因是?
A得 9,计算正确
B显示为 −7,因为发生溢出——9 超出 4 位补码的范围
C显示为 1,因为进位被截断
D显示为 −1,因为符号位出错
4 位补码最大正值为 7,无法表示 9;两个正值相加却得负值模式,正是溢出的标志。
1.7
1.7 分数的存储 · STORING FRACTIONS

浮点记数法:符号位 + 指数域 + 尾数域

本节小结 浮点记数法(floating-point notation)把字节分成符号位、指数域(exponent field,用余码存储)尾数域(mantissa field,规范化形式从最左边的 1 开始填充)。教学用 8 位格式:1 位符号 + 3 位指数 + 4 位尾数。尾数域不够大会产生截断误差(truncation error);1/10 这类无穷展开永远无法精确存储;多个值相加宜先小后大。实际系统:32 位单精度(约 7 位十进制有效数字)、64 位双精度(约 15 位)。

教学用 8 位格式

符号位 指数域(3 位,余码) 尾数域(4 位)

解码示例:01101011

步骤操作
拆分:符号位 0 | 指数 110 | 尾数 1011
尾数左边放基数小数点 → .1011
指数 110 按余码解码为 +2 → 小数点右移 2 位 → 10.11
符号位 0 为非负值 → 10.11 = 2 + 3/4 = 2.75

截断误差的三副面孔

① 丢位:8 位格式存 2+5/8(10.101),最右边的 1 放不进尾数域,实际存下 2+1/2。

② 无穷展开:1/10 在二进制中无穷循环——以美元为单位时一角钱都存不准;改以“分”为单位即可用整数精确存储。

③ 顺序敏感:(2½ + ⅛) + ⅛ 两次截断仍得 2½(错);2½ + (⅛ + ⅛) = 2¾(对)——先加小值。

浮点 = 科学记数法的二进制版:指数定大小,尾数定精度。
§1.7课堂练习
Q13按教材的 8 位浮点格式(1 位符号 + 3 位余码指数 + 4 位尾数),位模式 00111100 表示的值是?
A3/4
B1/2
C3/8
D3/16
符号位 0;指数 011 按余码 = −1;尾数 .1100 小数点左移 1 位得 .01100 = 1/4 + 1/8 = 3/8。
Q14一个粗心程序员用浮点数以“美元”为单位处理金额,最可能遇到什么麻烦?
A一角(0.1 美元)在二进制中是无穷展开,无法精确存储
B美元符号没有对应的 ASCII 码
C浮点数不能表示正数
D金额太大必然溢出
1/10 的二进制表示无穷循环,浮点只能存其近似值;教材建议的解法是以“分”为单位改用整数(如补码)精确存储。
1.8
1.8 数据与程序设计 · DATA AND PROGRAMMING

Python:在更高抽象层次上表达算法

本节小结 人类很少直接在 0/1 层面工作,程序设计语言(programming language)让人能用更高层次的抽象向计算机精确表达算法。Python 由吉多·范罗苏姆于 20 世纪 80 年代末创立,强调可读性。它的变量类型正对应本章内容:布尔值(1.1)、字符串(1.4)、整数(1.6)、浮点数(1.7);十六进制 0xFF 只是书写捷径,print 仍输出十进制 255。

例:货币换算脚本(教材 1.8 节)

# 国际货币换算
USD_to_GBP = 0.76 # 今日汇率
GBP_sign = '£'
dollars = 1000 # 待兑换美元
pounds = dollars * USD_to_GBP
print('Today, $' + str(dollars))
print('converts to ' + GBP_sign + str(pounds))

运行输出:Today, $1000
converts to £760.0

变量类型 ↔ 本章表示

my_Boolean = True
 → 真/假值(1.1 节)
my_string = 'characters'
 → 文本(1.4 节)
my_integer = 5
 → 整数(1.6 节)
my_floating_point = 26.2
 → 浮点数(1.7 节)

有人已把程序设计(编码)视为现代读写能力中继阅读、写作、算术之后的又一基础支柱。

本章的每一种数据表示,都是程序设计语言变量背后的实现。
§1.8课堂练习
Q15Python 中执行 print(0xFF),输出结果是?
A0xFF
B255
CFF
D11111111
print() 默认按十进制输出;十六进制只是书写捷径,不改变内存中 0/1 的存储形式。
Q16教材在本章引入 Python 的主要目的是说明?
APython 是唯一适合初学者的语言
B如何编写大型商业软件
C计算机只能执行 Python 程序
D程序设计语言让人在更高抽象层次上表达算法,其变量类型正对应本章的数据表示
本节要点:语言的抽象(布尔、字符串、整数、浮点)正建立在 1.1–1.7 节的位模式表示之上。
1.9
1.9 数据压缩 · DATA COMPRESSION

无损保真,有损换空间

本节小结 四种通用技术:行程长度编码(值 + 次数)、频率依赖编码(高频项用短码,如哈夫曼编码)、相对编码(只记与前一项的差)、字典编码(LZW 边编码边扩充字典)。GIF:256 色调色板 + LZW;JPEG:利用人眼对亮度比对颜色更敏感,可压缩 10~30 倍;MP3:利用人耳的时域/频域掩蔽;MPEG:只整帧编码少数 I 帧,帧间记差别。无损(lossless)可完整还原,有损(lossy)只能还原近似值。

LZW 字典编码示例

消息 xyx xyx xyx xyx,初始字典仅 x、y、空格。编码过程中把新遇到的“单词”加入字典:

xyx xyx xyx xyx → 121 3 4 3 4 3 4

解码时从同一个三条目小字典出发,同样能边解码边重建字典——无需随消息传送大字典。

媒体标准速览

标准利用的“弱点”典型表现
GIF调色板仅 256 色简单动画、透明背景;不适合摄影
JPEG人眼对亮度比对颜色敏感色度 2×2 平均 + 8×8 离散余弦变换,压缩 10~30 倍
MP3人耳时域/频域掩蔽删去听不到的细节,接近 CD 音质,≤ 64 Kbit/s
MPEG相邻视频帧高度相似I 帧整帧编码,帧间只记差别,约 40 Mbit/s

压缩的真正动机往往不只是省空间——视频会议若每帧需 1 MB 而链路每秒只能传 1 KB,再好的画质也无济于事;音视频压缩首先是为了及时传输

常见速率单位:Kbit/s(千位每秒)、Mbit/s(兆位每秒)、Gbit/s(吉位每秒)。1 GB 约可存 400 首 MP3 流行歌曲。

压缩的本质:利用数据内部的冗余,以及人类感官的局限。
§1.9课堂练习
Q17JPEG 基线标准能获得高压缩率,主要利用了人眼的什么特性?
A人眼无法分辨超过 256 种颜色
B人眼对快速运动的物体不敏感
C人眼对亮度的变化比对颜色的变化更敏感
D人眼会自动脑补缺失的像素
JPEG 先对 2×2 像素块的色度求平均(砍掉 3/4 色度信息而保留全部亮度),再做 8×8 离散余弦变换——画质几乎无损。
Q18MP3 音频压缩利用的人耳特性是?
A人耳听不到 44 100 Hz 以上的声音
B时域掩蔽与频域掩蔽——巨大声响后或相近频率的轻柔声音人耳觉察不到
C人耳对立体声不敏感
D人耳只能分辨 3 字节长的音符
MP3 删去那些被“掩蔽”的细节,获得显著压缩而保持接近 CD 的音质。
1.10
1.10 通信差错 · COMMUNICATION ERRORS

先能“发现错”,再能“改对错”

本节小结 奇偶校验位(parity bit):附加 1 位使每个模式恒含奇数(奇校验)或偶数(偶校验)个 1,可检测奇数个差错,但检不出偶数个;扩展为校验字节、校验和(checksum)CRC纠错码利用汉明距离(Hamming distance,两模式不同位的个数):教材示例编码任意两合法模式距离 ≥ 3,故每个模式最多检 2 错、纠 1 错——设备可靠不靠“永不出错”,而靠“出错能被发现甚至纠正”。

例:纠错码如何“改错”

符号编码与 010100 的距离
A0000002
B0011113
C0100112
D0111001 ← 最近

收到 010100:它与合法模式 D 的汉明距离为 1,与其他任何合法模式至少为 2,故判定传输的字符是 D——差错被自动纠正。

若编码的最小汉明距离提高到 5,则可检 4 错、纠 2 错。设计这类编码属于代数编码理论(线性代数与矩阵理论的分支)。

理查德·汉明
理查德·汉明(R. W. Hamming)——因不满 20 世纪 40 年代继电器机器的不可靠而开创纠错码研究(Wikipedia)

应用实例:CD-DA 音频格式的纠错能力为“两张 CD 只出一个错”;交付软件的 CD 加强纠错至“20 000 张盘出一个错”。

奇偶校验回答“错了吗?”,纠错码回答“原来是什么?”
§1.10课堂练习
Q19下列字节按奇校验编码(含校验位),哪一个一定有错?
A000000000
B100000001
C100101101
D111000000
奇校验要求每个模式含奇数个 1。A 有 0 个 1(偶数),必出错;B、C 有 3 个,D 有 3 个,均合法(但偶数个差错仍可能漏检)。
Q20某纠错码中任意两个合法模式的汉明距离至少为 3,则每个模式最多可以?
A检测 3 个差错、纠正 3 个差错
B检测 1 个差错、纠正 1 个差错
C检测 3 个差错、纠正 2 个差错
D检测 2 个差错、纠正 1 个差错
改 1 位必成非法模式(可检);改 1~2 位也不会变成另一合法模式(可检 2 错);距原模式 1、距其他合法模式 ≥ 2,故能纠 1 错。
参考答案(共 20 题,点击展开)
题号Q1Q2Q3Q4Q5Q6Q7Q8Q9Q10
答案BCBADCADBC
题号Q11Q12Q13Q14Q15Q16Q17Q18Q19Q20
答案DBCABDCBAD