欢迎来到信息表示法 (Information Representation)!

你有没有想过,计算机本质上只是一堆微小的电子开关,它是如何让你观看高画质电影、播放你最爱的歌曲,或是存储你的作业?这一切都要归功于信息表示法。在本章中,我们将探讨计算机如何将现实世界「翻译」成 1 和 0。如果一开始觉得这些概念有点「天外来客」,请不用担心——我们会一步一步为你拆解!


1.1 数据表示法:基础概念

二进制量级:Kilo 与 Kibi 的混淆

在「人类」的世界中,我们使用十进制系统 (Base 10)。当我们说「kilo」时,指的是 1,000。然而,计算机使用二进制系统 (Base 2),所有数值都以 2 的幂次运作。这导致我们在衡量数据时产生了细微的差异。

十进制前缀 (Base 10): 这是你日常生活中使用的单位。

• kilo (k): \(10^3 = 1,000\)
• mega (M): \(10^6 = 1,000,000\)
• giga (G): \(10^9 = 1,000,000,000\)
• tera (T): \(10^{12} = 1,000,000,000,000\)

二进制前缀 (Base 2): 这些是计算机的「真实」测量单位。

• kibi (Ki): \(2^{10} = 1,024\)
• mebi (Mi): \(2^{20} = 1,048,576\)
• gibi (Gi): \(2^{30} = 1,073,741,824\)
• tebi (Ti): \(2^{40} = 1,099,511,627,776\)

记忆小撇步: 如果词汇中间带有「bi」(例如 kibi),它就代表 Binary(二进制),因此它使用的是 1,024 倍数的刻度!


数值系统:二进制、十进制与十六进制

在计算机科学中,我们主要使用三种数值系统:

1. 十进制 (Denary/Base 10): 我们每天使用的 0–9 数字。
2. 二进制 (Binary/Base 2): 只有 0 和 1。这是计算机的母语。
3. 十六进制 (Hexadecimal/Base 16): 使用 0–9 以及 A–F(其中 A=10, B=11, C=12, D=13, E=14, F=15)。

为什么要用十六进制? 它比二进制简短得多,且人类阅读时较不容易出错。一个「十六进制」数字恰好代表 4 个二进制位(称为一个 nibble)。

快速回顾: 要将二进制转换为十六进制,请从右边开始将二进制数字每 4 个一组分开。例如,\(1011\ |\ 0101\) 会变成 \(B\ |\ 5\),即 \(B5_{16}\)。


二进制编码十进制 (BCD)

BCD 是一种特殊的数字表示法,将十进制数字的每一个位各自存储为 4-bit 的二进制码。

例子: 要以 BCD 表示数字 85:
8 = 1000
5 = 0101
因此,85 的 BCD 表示为 1000 0101。

现实应用: BCD 常见于数字时钟或计算器,因为这些设备需要个别控制屏幕上的每一个数字。


带符号整数:一补码与二补码

计算机如何辨识一个数是负数?我们使用二补码 (Two's Complement)。

步骤:如何使用二补码将数字变为负数:

1. 先写出该数字的正数二进制形式。
2. 反转 (Flip) 所有位(将 0 改为 1,1 改为 0)。这称为「一补码 (One's Complement)」。
3. 将结果加 1。这就是「二补码」。

常见错误: 别忘了在 8-bit 的带符号数字中,最左边的位是符号位 (sign bit)。如果它是 1,该数字就是负数!

带符号二进制加法、减法与溢出:

• 加法: 依照二进制加法规则逐个位进行运算。
• 减法: 先求出减数的二补码(将其变为负数),然后将其加到被减数上。
• 溢出 (Overflow): 当计算结果超出所分配的位数量时发生(例如,将两个正的 8-bit 带符号数字相加,产生的结果太大而无法放入 8 bits 中,导致符号位被翻转)。这会导致计算机运算错误。


字符集:ASCII、扩展 ASCII 与 Unicode

计算机通过为每个字符分配一个唯一的二进制数字(字符代码)来表示文本。考试时你不需要死记具体的代码,但你必须知道这些系统之间的差异:

• 标准 ASCII: 使用 7 bits 来表示每个字符,提供 \(2^7 = 128\) 个可能的字符(包括大写/小写英文字母、数字 0–9、标点符号以及控制字符)。
• 扩展 ASCII (Extended ASCII): 每个字符使用 8 bits (1 byte),提供 \(2^8 = 256\) 个可能的字符。这为非英语的带重音字母及图形符号提供了额外空间。
• Unicode: 一个通用的字符集,旨在表示世界上所有现代与历史语言的文字,以及数学符号和表情符号 (emojis)。UTF-8 与 UTF-16 使用可变长度的编码,而 UTF-32 是固定长度;Unicode 可容纳超过一百万个码位(code points)。

重点总结: 二进制是给计算机用的,十六进制是让人更容易阅读二进制,二补码处理负数,而字符集则将二进制代码转换为字母与符号。


1.2 多媒体:图形与声音

位图 (Bitmapped Graphics)

位图由称为像素 (pixels)(图像元素)的微小点组成。每个像素都被分配了一个二进制颜色代码。

• 图像分辨率: 图像的宽度像素数乘以高度像素数(例如 \(1920 \times 1080\))。
• 屏幕分辨率: 屏幕或显示器上每单位长度所显示的像素数量(通常以每英寸点数 dots per inch 或每英寸像素 pixels per inch 衡量),或是显示设备的整体像素尺寸。
• 色彩深度 (Color Depth / Bit Depth): 用来表示单一像素颜色的位数。使用的位越多,颜色就越丰富(例如 8-bit 色深允许 \(2^8 = 256\) 种颜色)。
• 文件头 (File Header): 文件开头的一小部分,存储有关图像的元数据 (metadata),例如其尺寸、分辨率和色深。

计算文件大小:
\(\text{File Size} = \text{Image Resolution (Width} \times \text{Height)} \times \text{Color Depth}\)
例子: 一张 \(100 \times 100\) 且具备 1-bit 色深的图片,文件大小为 \(10,000\) bits。


矢量图 (Vector Graphics)

矢量图不存储像素,而是存储一张绘图列表,包含数学对象(线条、圆形、矩形)及其属性(颜色、粗细、位置)。

比喻: 位图就像照片;如果你放大太多,它会变得「有块状感」(像素化)。矢量图则像是一组绘图指令;即使你把它放大得跟房子一样大,看起来依然完美清晰!


声音

声音本质上是模拟 (analogue) 的(连续波形),但计算机是数字 (digital) 的。为了存储声音,我们必须进行采样 (sampling)。

• 采样: 在固定的时间间隔内,「快照」声音波形的振幅。
• 采样率 (Sampling Rate): 每秒进行多少次采样(单位为赫兹,Hz)。采样率越高 = 品质越好但文件越大。
• 采样分辨率 (Sampling Resolution): 用来存储每个采样点的位数。分辨率越高 = 对声音音量的表示就越精确。

你知道吗? 标准 CD 使用的采样率为每秒 44,100 次!这可是大量的快照。

重点总结: 位图使用像素;矢量图使用数学。声音是通过将模拟波形采样成数字位来捕捉的。


1.3 压缩 (Compression)

压缩是将文件变小的过程。我们为什么需要它?为了节省存储空间,并让文件在网络上传输得更快。

有损与无损压缩

1. 有损压缩 (Lossy Compression): 永久删除一些人类眼睛或耳朵不太可能注意到的数据。一旦删除,就无法恢复。(例子:JPEG, MP3)。
2. 无损压缩 (Lossless Compression): 在不丢失任何原始数据的情况下减小文件大小。当你解压缩时,它与原始文件完全相同。(例子:PNG, ZIP)。


行程编码 (Run-Length Encoding, RLE)

RLE 是一种简单的无损压缩形式。它寻找连续重复的数据片段,并将其存储为一个单一数值和一个计数。

例子: 想象一排像素:WWWWWBBRRR
使用 RLE,我们将其存储为:5W, 2B, 3R
我们刚刚把 10 个字符变成了 6 个!这对于具有大面积相同颜色的简单图像非常有效。

快速回顾: 当你需要极小的文件且不介意品质轻微下降时(例如流媒体视频),使用有损压缩。当数据必须完美无缺时(例如文本文档或程序代码),使用无损压缩。

重点总结: 压缩节省空间。有损压缩丢弃数据;无损压缩通过巧妙的存储方式保留一切完美细节。