计算机科学基础
信息表示
引入问题
计算机通常将颜色表示为红-绿-蓝(RGB)三元组,其中每个红色、绿色和蓝色分量是介于 0 到 255 之间的整数。例如,颜色 (255, 0, 10) 具有完全的红色,没有绿色,并且只有少量的蓝色。请编写一个算法,输入颜色的 RGB 分量,并返回一条消息,指明最大分量或分量。例如,如果输入颜色是 (100, 255, 0),算法应输出“最大分量:绿色”。如果输入颜色是 (255, 255, 255),则算法应输出“最大分量:红色、绿色、蓝色”。
本章概述
计算机的一个令人惊叹的特性是它可以存储如此多不同类型的数据。当然,计算机可以存储数字。但与简单的计算器不同,它还可以存储文本、颜色、图像、音频、视频等多种类型的数据。不仅如此,它还能分析这些数据,并将它们传输到其他计算机。这种多功能性是计算机如此有用并影响我们生活许多领域的一个原因。
为了理解计算机和计算机科学,了解计算机如何处理不同类型的数据是很重要的。让我们回到颜色的例子。颜色是如何存储在计算机中的?引入问题中提到了一种方法:作为 RGB 三元组。这并不是唯一可能的方式。RGB 只是众多颜色系统中的一种。例如,有时颜色表示为 HSV 三元组:色相、饱和度和亮度。然而,RGB 是计算机程序中最常见的颜色表示方法。
这引发了一个更深层次的问题:数字是如何存储在计算机中的?而且,为什么理解数字及其他类型数据的存储和处理方式对我们来说如此重要?本章将讨论这些以及相关的问题。我们将重点探讨以下内容:
- 为什么这个话题很重要?
- 计算机如何表示数字?
- 计算机如何表示文本?
- 计算机如何表示其他类型的数据,例如图像?
- 什么是二进制数系统?为什么它在计算机科学中如此重要?
- 计算机如何执行基本操作,例如加法和减法?
目标
完成本章后,您应能够:
- 解释在最低层级上,计算机如何表示数值、文本数据以及颜色等其他类型的数据。
- 解释并使用本领域的基本术语:位(bit)、字节(byte)、兆字节(megabyte)、RGB 三元组、ASCII 等。
- 实现不同表示形式之间的转换,例如将数字和文本从一种表示形式转换为另一种表示形式。
- 将整数从十进制转换为补码表示形式,或其他形式之间的转换。
- 在无符号二进制或补码表示中执行加法和减法。
- 解释用于表示数据的位数如何影响表示范围和精度。
- 概述计算机如何表示不同类型的数据,例如图像。
- 执行与某些数据集的内存量或下载时间相关的计算。
数据表示与数学
数据表示与通识教育和数学有什么关系?可以猜到,它们之间有很强的联系。计算机以二进制(即基数为 2)数字形式存储所有数据。因此,要理解计算机,就必须理解二进制。不仅要理解二进制的基础知识,还需要理解一些复杂情况,例如下面讨论的“补码”表示法。
二进制表示很重要,不仅因为它是计算机表示数据的方式,还因为许多计算机和计算的基础都建立在二进制上。例如,我们将在机器组织章节中再次看到它。
数据表示、社会与技术
“计算机革命”是一个常被用来描述计算机对我们生活产生影响的短语。另一个常听到的短语是“数字革命”。那么数字革命是什么意思呢?
如今,我们的许多设备都是数字化的,比如数字手表、数字电话、数字广播、数字电视等。然而,在过去,许多设备是模拟的,即“数据以连续可变的物理量表示”[1]。想一想旧式手表,其秒针、分针和时针连续移动(虽然分针和时针移动得非常缓慢)。与此相比,现代许多手表显示时间为数字形式,例如 2:03:23。
这个例子突出了模拟设备与数字设备之间的关键区别:模拟设备依赖于连续现象,而数字设备依赖于离散现象。另一个例子是,模拟广播接收音频信号以无线电波的形式传输,而数字广播接收的信号是一组数字流。
数字革命指的是许多数字设备的使用及其影响。这些设备不仅包括计算机,还包括通信系统等在我们生活中扮演重要角色的其他设备或系统。
由于数字设备通常使用二进制数系统存储数字,本章的一个重要主题是数据的二进制表示。二进制是计算机和计算机科学的基础:要理解计算机如何工作,以及计算机科学家的思维方式,就必须理解二进制。本章的第一部分将介绍二进制的基础知识,第二部分将在此基础上解释计算机如何存储不同类型的数据。
表示基础
简介
计算的核心在于信息处理。每次计算都是对符号的某种操作,这种操作可以完全机械地(盲目地)进行。如果我们能够用符号表示信息,并知道如何处理这些符号以及解释结果,就能够获得有价值的新信息。在本节中,我们将研究计算中的信息表示。
算法章节讨论了一种描述操作序列的方法。计算机科学家使用算法来指定计算机的行为。然而,为了使这些算法有用,它们需要数据,因此计算机需要能够表示数据的方式。[3]
信息通过消息的内容传递,当信息被解释并通过我们的感官感知时,会引起特定的心理反应。信息总是以某种形式被编码,用于传递和解释。我们时刻在处理信息。例如,我们通过阅读书籍、听故事、看电影或做梦接收信息。我们通过写电子邮件、画图、表演或演讲传递信息。信息是抽象的,但它通过具体的媒介传递。例如,一场电话交谈传递了信息,但这些信息沿途是通过声波和电子信号表示的。
信息是抽象/虚拟的,而承载信息的媒介必须是具体/物理的。因此,在任何信息能够被处理或传递之前,必须经过量化/数字化的过程:即使用符号将信息转换为数据表示。
人们有许多方式表示一个简单的数字。例如,数字“4”可以表示为 4、IV、|||| 或 2+2 等。那么计算机如何表示数字?(或者文本、音频文件呢?)
计算机表示和处理数字的方式与我们不同。自计算机早期发展以来,二进制数系统已成为标准。计算机“喜欢”二进制,因为对它们来说,这种方式非常简单。然而,对人类来说,二进制并不容易。尽管大多数时候人们不需要关注计算机使用的内部表示,但有时却需要。
为什么选择二进制?
假设你和朋友们在小屋度过周末,大家分两辆车出行,并约定第一辆到达的小组将前灯打开,方便后到的小组识别。当你所乘的车到达时,你可以通过灯光的状态(亮或灭)来判断是否是第一辆到达的车。灯光因此编码了两种可能性:亮(另一组已经到达)或灭(另一组尚未到达)。
要传递更多信息,可以使用两盏灯。例如,两盏灯都灭表示第一组未到达;第一盏灭第二盏亮表示第一组到达后去买补给;第一盏亮第二盏灭表示第一组到达后去钓鱼;两盏都亮表示第一组到达且未离开。
这里的关键点是:灯光只有两种状态——亮或灭(不允许不同亮度、多种颜色或其他选项)。此外,如果我们想表示多于两种选择,可以使用更多的灯光。
这种“亮或灭”的思想非常强大。只有两种选择或状态:亮或灭、0 或 1、黑或白、有或无、大或小、粗糙或光滑等——这些都是表示可能性的不同方式。二选一的强大之处在于,它使得构建具有最低层数据为两种状态的对象(如计算机、相机、CD 等)变得容易。[4]
在计算机表示中,一个位(bit,即二进制数字)可以是 0 或 1。多个位的集合称为位串(bitstring)。长度为 8 位的位串称为字节(byte)。位和字节是计算机存储和数据传输中的重要概念,后面我们会进一步解释这些概念及其相关术语。但首先我们来看计算机如何表示数字的基本问题。
历史简述
克劳德·香农被认为是信息论之父,因为他是第一个研究信息和信息传递的数学模型的人。他还对计算领域做出了许多其他重大贡献。他的奠基性论文《通信的数学理论》(1948 年)改变了我们对信息的看法,奠定了信息时代的基础。香农发现,信息的基本单位是问题的一个“是或否”答案,或一个具有两种不同状态的位,仅需两个符号即可表示。他还通过证明布尔代数的命题可以用来构建能够执行通用计算(两种符号操作)的“逻辑机器”,奠定了数字计算机/电路的设计理论。
外部和内部信息表示
信息可以在不同的层次上表示。将信息表示分为两类是有帮助的:外部表示和内部表示。外部表示用于人类与计算机之间的通信。我们在计算机显示器或屏幕上看到的所有内容,无论是文本、图像还是动画,都是某种信息的表示。计算机还通过声音或其他媒介(例如盲人阅读文本的触摸板)外部表示信息。
内部表示中,所有现代计算机都将信息表示为位。我们可以将位视为具有两种可能值的数字。由于位是信息的基本单位,因此它足以表示所有信息。这也是最简单的表示,因为只需两个符号即可表示两种不同的值。这使得物理上表示位变得容易——任何能够具有两种不同状态的设备都可以,例如开关。稍后我们将看到,现代计算机处理器由称为晶体管的小型开关组成。
十进制数系统回顾
将位组合成序列后,它们可以表示数字。我们熟悉用数字表示数量。数字是表示抽象数量的具体符号。人类由于有十根手指,方便地采用了以十为基数的(十进制)数字系统,它需要十个不同的符号。我们每天都使用十进制表示,例如,阿拉伯数字使用 0 到 9。每个符号根据它所在的位置表示十的幂。
例如,数字 124(即一百二十四)可以表示为:
(1×100)+(2×10)+(4×1)(1 \times 100) + (2 \times 10) + (4 \times 1)
如果将十进制的知识应用于二进制,我们可以理解二进制。首先记住,一个位是一个二进制数字,一个字节是 8 位。在本文件中,我们讨论的二进制数字大多是一个字节长的。
为什么选择二进制
十进制只是一个约定,实际上我们常常用其他基数系统表示数量,例如一周的 7 天(基数 7),一小时的 60 分钟(基数 60),一天的 24 小时,或一磅的 16 盎司等。可以想象,基数 2(两个符号)是最简单的基数系统,因为少于两个符号,我们无法表示变化(因此无法传递信息)。
无符号二进制
当我们谈论十进制时,我们使用的是 10 个数字:0 到 9(十进制的来源)。在二进制中,只有两个数字,这就是它被称为“二进制”的原因。二进制的数字是 0 和 1,永远不会出现 2 或 3 等。如果有,那就是出错了。一个位(bit)只能是 0 或 1。
二进制计数的方式如下:
0 (十进制 0)
1 (十进制 1)
10 (十进制 2)
11 (十进制 3)
100 (十进制 4)
101 (十进制 5)
...
一个老笑话是这样说的:“世界上有 10 种人:懂二进制的和不懂二进制的。”
一字节中的可能值
接下来我们来看一字节中的可能值。以下是一个字节中每一位的 2 的幂:
2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0
128 64 32 16 8 4 2 1
例如,二进制数 10011001
可以表示为:
(1 × 128) + (0 × 64) + (0 × 32) + (1 × 16) +
(1 × 8) + (0 × 4) + (0 × 2) + (1 × 1) = 153
每个比特可以是 0 或 1,因此 8 位的总可能性是 28=2562^8 = 256。在无符号二进制中,这些可能值表示从 0(所有位为 0)到 255(所有位为 1)的整数。
不同进制的表示
所有进制系统的工作原理相同:最右边的数字表示基数的 0 次幂(任何数的 0 次幂都是 1),向左的每一位表示比右边一位大一个基数倍的值。例如,二进制数 1001
在十进制中表示 9,因为:
(1 × 2^3) + (0 × 2^2) + (0 × 2^1) + (1 × 2^0) = 8 + 0 + 0 + 1 = 9
为了避免混淆,我们通常在数字后添加下标表示进制,例如 1001_2
表示二进制数 1001
。这表明它并不是十进制中的 1001。
相同的数量可以用不同的方式表示。例如,数字 9 可以表示为十进制的 9_10
或中文的 九
。
二进制到十进制的转换
将非负整数的二进制表示转换为十进制表示非常简单:将每位二进制数字表示的值相加即可。例如:
1001_2 = (1 × 2^3) + (0 × 2^2) + (0 × 2^1) + (1 × 2^0) = 9_10
十进制到二进制的转换
将十进制转换为二进制的一种方法是反复除以 2,并记录余数。例如,将十进制数 75 转换为二进制:
75 ÷ 2 = 37, 余数 = 1
37 ÷ 2 = 18, 余数 = 1
18 ÷ 2 = 9, 余数 = 0
9 ÷ 2 = 4, 余数 = 1
4 ÷ 2 = 2, 余数 = 0
2 ÷ 2 = 1, 余数 = 0
1 ÷ 2 = 0, 余数 = 1
从下往上读取余数,得到二进制数 1001011
。为了形成 8 位,我们在前面补充 0,得到 01001011
。
二进制运算
二进制加法
二进制加法有四条规则:
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10 (进位)
例如:
00110101
+ 10101100
==========
11100001
进位显示如下:
0111100
00110101
+ 10101100
==========
11100001
将二进制转换为十进制验证:00110101_2 = 53_10
,10101100_2 = 172_10
,53 + 172 = 225
,结果 11100001_2
是正确的。
二进制减法
二进制减法规则:
0 - 0 = 0
0 - 1 = -1 (借位)
1 - 0 = 1
1 - 1 = 0
例如:
10011101
- 00100010
==========
01111011
借位显示如下:
1100010
10011101
- 00100010
==========
01111011
十进制验证:157 - 34 = 123
。
溢出问题
如果加法结果超过了位数限制(如 8 位),会产生溢出。例如:
01110100
+ 10011111
==========
100010011 (9 位)
十进制验证:116 + 159 = 275
,超出 8 位最大值 255,导致溢出。
二进制相关表示
其他表示包括:负数、小数部分等。这些问题涉及到补码、浮点数等,我们将在后续章节详细讨论。这些表示旨在使二进制操作更易于人类理解。
十六进制
概述
计算机擅长处理二进制,但二进制对于人类来说却难以书写、阅读和理解。如果需要一种更易于人类阅读,同时又与二进制紧密相关的数字系统,十六进制(基数为16)是一种可能的选择。
然而,使用基数大于10的系统会面临一个问题:数字在 0 到 9 后用完了,无法直接表示 10、11 等。因此,我们用字母代替这些值:A 表示 10,B 表示 11,C 表示 12,D 表示 13,E 表示 14,F 表示 15。因此,十六进制的数字范围是 0 到 F,而不是十进制的 0 到 9,也不是二进制的 0 和 1。
十六进制位置的值
在十六进制中,每个位置代表 16 的幂。例如,两位十六进制数 D8 表示如下:
16^1 16^0 <- 十六进制位置
16 1 <- 十进制中的对应值
D 8 <- 示例十六进制数
因此,D8 在十进制中表示:
(13×16)+(8×1)=216(13 \times 16) + (8 \times 1) = 216
需要注意的是,任何两位的十六进制数都可以表示与一个字节(8 位二进制数)相同的信息。例如,最大的两位十六进制数 FF 表示:
(15×16)+(15×1)=255=111111112(15 \times 16) + (15 \times 1) = 255 = 11111111_2
这与 8 位二进制数的最大值一致。因此,十六进制比二进制更易于阅读和书写。
表示的明确性
在某些情况下,数字的表示方式可能并不明确。例如,10
是十进制的 10,还是二进制的 2,或者是十六进制的 16?通常可以通过上下文判断,但当需要明确时,我们使用下标表示:
10_{10}
表示十进制的 1010_{2}
表示二进制的 10(十进制的 2)10_{16}
表示十六进制的 10(十进制的 16)
十六进制和其他进制的转换
示例 1:二进制到十六进制
将二进制数 00111100
转换为十六进制:
- 将其分为两个 4 位部分:
0011
和1100
。 - 将每部分转换为十进制:
0011 = 3
,1100 = 12
。 - 12 在十六进制中为 C,因此结果是
3C
。
示例 2:十六进制到二进制
将十六进制数 D6 转换为二进制:
- D 在十六进制中是十进制的 13,二进制为
1101
。 - 6 在十进制中是
0110
。 - 合并这两部分,得到
11010110
。
十六进制表示的用途
十六进制不常见,但在某些领域中很有用,例如表示内存地址或颜色。例如,24 位 RGB 颜色中,每种颜色(红、绿、蓝)用 8 位表示,这相当于 2 位十六进制。因此,24 位颜色可用 6 位十六进制表示。例如,FF0088
表示一个 RGB 颜色,其中红色为满值,绿色为 0,蓝色为中等值。
十六进制与其他进制的对应关系
以下是十六进制数字及其对应的十进制和二进制值:
十六进制 | 十进制 | 二进制 |
---|---|---|
0 | 0 | 0000 |
1 | 1 | 0001 |
2 | 2 | 0010 |
3 | 3 | 0011 |
4 | 4 | 0100 |
5 | 5 | 0101 |
6 | 6 | 0110 |
7 | 7 | 0111 |
8 | 8 | 1000 |
9 | 9 | 1001 |
A | 10 | 1010 |
B | 11 | 1011 |
C | 12 | 1100 |
D | 13 | 1101 |
E | 14 | 1110 |
F | 15 | 1111 |
文本表示
文本可以视为符号流,用比特序列表示。常见编码方式包括:
- ASCII:使用 1 字节(8 位)表示一个符号,可表示多达 256 个符号,包括英文大小写字母和常用符号。
- Unicode:扩展了 ASCII,使用多字节编码,可表示所有书写语言中的符号及更多内容。
十六进制的简洁性和与二进制的直接对应,使其在计算机领域中具有重要价值。
图像、音频和视频文件
图像、音频和视频是计算机处理的其他类型的数据。计算机如何表示这些数据类型是一个复杂但令人着迷的话题。例如,有感知问题(如人类能听到哪些声音,这如何影响我们需要存储多少数字以可靠地表示音乐?)、大小问题(这些数据类型可能会导致大文件)、标准化问题(如 JPEG 或 GIF 图像格式)等。
我们无法深入探讨图像、音频和视频的表示方式,因为其细节过于复杂。例如,JPEG 图像使用了一种高级的数学技术——离散余弦变换。然而,值得了解一些关于这些文件类型的高层次关键点:
- 计算机不仅能表示基本的数字和文本数据,还能表示音乐、图像和视频等复杂数据。
- 它们通过对数据进行数字化来实现。在最低层,数据仍然用比特表示,但高层有更复杂的表示结构。
- 有许多方法可以对这些数据进行编码,因此标准化的编码技术非常有用。
- 音频、图像和视频文件通常很大,给存储、处理和传输带来了挑战。因此,大多数编码技术都使用复杂的压缩方法。
图像表示
感知图像是光线进入眼睛并触发神经信号传递到大脑的结果。在计算中,图像通过网格点(称为像素,来自 "picture element")模拟,每个像素都有特定颜色。这种方法之所以有效,是因为当分辨率(使用的点数量)足够高时,人眼无法分辨原始图像与基于点的图像之间的差异。事实上,计算机屏幕本身就是使用像素网格来显示图像和文本的。
银河系的最大照片
“有史以来最大最详细的银河系照片已公开。这张巨大的九亿像素图像捕捉了银河系核心超过 8400 万颗恒星。它由位于智利欧洲南方天文台帕瑞纳天文台的可见与红外巡天望远镜(VISTA)收集的数据创建。如果以报纸的分辨率打印,它将有 30 英尺长、23 英尺高,分辨率为 108,200 × 81,500 像素。”[5]
虽然这张银河系图像是一个极端例子,但它说明了即使是较小的图像也会占用大量计算机空间。以下是一个更普通的例子:假设你有一张宽 1500 像素、高 1000 像素的图像,每个像素存储 24 位颜色。那么存储这张图像需要多少字节?
计算
- 每行 1500 像素,1000 行,总像素数为 1500×1000=1,500,0001500 \times 1000 = 1,500,000。
- 每像素 24 位,合计 1,500,000×24=36,000,0001,500,000 \times 24 = 36,000,000 位。
- 转换为字节(1 字节 = 8 位):36,000,000÷8=4,500,00036,000,000 \div 8 = 4,500,000 字节,即约 4.5MB。
压缩技术
大多数图像实际占用的空间远小于直接存储所需的大小,这是因为它们使用了压缩技术。例如,在夜景图像中,如果图像上半部分全是黑色(RGB 值为 (0,0,0)),与其为图像的每个黑色像素都存储 (0,0,0),更高效的方法是使用“简写”,如记录 (0,0,0) 和一个数字,表示从顶部开始有多少像素是黑色。
压缩技术产生了压缩图像:这种图像包含原始图像的全部或大部分信息,但以更高效的方式表示。例如,如果原始图像需要 4MB,而压缩版本需要 400KB,则压缩比是 4MB 对 400KB,即约 10:1。
复杂的压缩标准(如 JPEG)使用多种技术压缩图像,这些技术可能非常复杂。
压缩的影响因素
图像能被压缩多少取决于多个因素。对于许多图像,压缩比可达到 10:1,但这取决于图像及其用途。例如:
- 图像复杂性:简单图像(如整个像素全黑)可以被极大压缩;复杂图像则压缩空间较小。
- 压缩质量:用户常愿意接受压缩图像与原始图像之间的小差异以换取更小的文件大小。无损压缩保留图像的全部信息,而有损压缩会丢失一些信息,但压缩率更高。
此外,图像编码还包括其他元数据,如图像大小、编码标准及创建的日期和时间。
视频
视频可以看作是一系列图像帧与同步音轨的组合,这些数据均用比特编码。
假设你有一个 10 分钟的视频,分辨率为 256×256 像素,每像素 24 位颜色,每秒 30 帧。编码方式是为视频中的每一帧的每一个像素存储所有比特。那么,这个视频的总文件大小是多少?如果你的下载速度是 500 千比特每秒,需要多长时间下载这个文件?
计算文件大小
文件大小计算如下:
256×256 像素×24 位/像素×10 分钟×60 秒/分钟×30 帧/秒256 \times 256 \, \text{像素} \times 24 \, \text{位/像素} \times 10 \, \text{分钟} \times 60 \, \text{秒/分钟} \times 30 \, \text{帧/秒}
结果约为 28 Gb(Gb 表示千兆比特)。转换为字节:
28 Gb÷8=3.5 GB28 \, \text{Gb} \div 8 = 3.5 \, \text{GB}
计算下载时间
以 500 Kbps 的下载速度:
28 Gb÷500 Kbps=56,000 秒28 \, \text{Gb} \div 500 \, \text{Kbps} = 56,000 \, \text{秒}
约为 15 小时。这比大多数人愿意等待的时间要长得多。如果视频分辨率更高(如全屏显示)、时长更长或下载速度更慢,所需时间会进一步增加。
解决文件大小的问题
视频文件大小是一个挑战,但下载 10 分钟视频通常不需要 15 小时。这是因为与图像文件类似,有多种方法可以减少文件大小和传输时间。例如,像 MPEG 这样的标准不仅使用图像压缩技术减少单帧存储大小,还利用了连续帧场景通常相似的特点,从而进一步压缩文件大小。
音频
一开始可能会认为音频文件不会像视频文件那样占用大量空间。然而,考虑到音乐等音频的复杂性,音频文件有时也可能非常大。
音频的基本原理
声音本质上是振动或声波通过空气传播。人类可以听到频率在 20 到 20,000 周/秒之间的声波。[9] 为了避免某些不理想的失真,音频文件的采样率需至少为最高频率的两倍。例如,CD 音乐通常以 44,100 Hz(每秒采样 44,100 次)采样。[10] 如果需要立体声效果,则需对两个通道进行采样。每个采样的幅度需要用足够多的比特存储,以提供逼真的表示。CD 通常使用每采样 16 位。
计算文件大小
一分钟音乐的大小:
44,100 采样/秒×16 位/采样×2 通道×60 秒/分钟÷8 位/字节=10.5 MB/分钟44,100 \, \text{采样/秒} \times 16 \, \text{位/采样} \times 2 \, \text{通道} \times 60 \, \text{秒/分钟} \div 8 \, \text{位/字节} = 10.5 \, \text{MB/分钟}
因此,一首 4 分钟的歌曲需要约 40 MB,而 1 小时的音乐需要约 630 MB,这大致是典型 CD 可存储的容量。[11]
计算下载时间
如果使用 1 Mbps 的下载速度下载 40 MB 的歌曲:
40 MB÷1 Mbps=320 秒40 \, \text{MB} \div 1 \, \text{Mbps} = 320 \, \text{秒}
即约 5 分钟。这并不算长,但更短的时间会更理想。
音频压缩技术
与视频类似,音频也有多种压缩方案。例如,MPEG 音频压缩标准可以将 4 分钟的歌曲压缩至约 4 MB,大幅减少了文件大小。[12]
压缩技术使得现代音频和视频文件在存储和传输方面更加高效,从而提高了使用体验。
表示的大小与限制
在上一节中,我们了解到,存储一页文本可能只需要几千字节;图像文件可能需要数万、数十万甚至更多字节;音乐文件可能需要数百万字节;而电影文件可能需要数十亿字节。此外,还有包含数万亿甚至千万亿字节数据的数据库。
存储单位及表示
计算机科学中有一些专门的术语和符号用于描述大规模字节的数量。以下是一个存储单位表,列出了其对应的 2 的幂及近似的英文描述:
单位 | 对应字节数量 | 英文描述 |
---|---|---|
1 千字节 (KB) | 210=10242^{10} = 1024 字节 | 大约一千字节 |
1 兆字节 (MB) | 220=1,048,5762^{20} = 1,048,576 字节 | 大约一百万字节 |
1 吉字节 (GB) | 230=1,073,741,8242^{30} = 1,073,741,824 字节 | 大约十亿字节 |
1 太字节 (TB) | 2402^{40} 字节 | 大约一万亿字节 |
1 拍字节 (PB) | 2502^{50} 字节 | 大约一千万亿字节 |
1 艾字节 (EB) | 2602^{60} 字节 | 大约一百亿亿字节 |
还有更大的单位和更小的量级可以表示。[13]
文件大小与比特表示的注意事项
千字节、兆字节等单位在讨论文件大小、计算机内存等时非常重要。需要注意:
- 文件大小通常以字节(或千字节、兆字节等)为单位。
- 但计算机科学中的一些量则通常以比特为单位表示。例如,下载速度通常用每秒比特数表示,“Mbps”代表“每秒百万比特”,其中“b”为小写;而“MB”(兆字节)中的“B”为大写。
在内存上下文中,千字节、兆字节等通常定义为 2 的幂(例如,1 千字节是 210=10242^{10} = 1024 字节,而不是精确的一千字节)。但在其他情况下,1 千字节可能定义为恰好一千字节,这可能导致混淆。在本书的讨论中,大多数问题中这种差异影响不大。例如,如果计算得出一个文件大小为 6536 字节,可以近似为约 6.5 KB,除非问题有特殊说明。[14]
表示的限制
物理限制
表示的数量受物理空间的限制。例如,如果在纸上书写十进制数,纸张大小和字体大小限制了可以书写的数字位数。同样,在计算机中,可以物理存储的比特数量也是有限的。
例如,3 个比特可以生成 23=82^3 = 8 种表示形式:
000, 001, 010, 011, 100, 101, 110, 111
通常分别表示 0 到 7。需要注意,表示本身没有内在的意义,3 位比特可以代表 8 种不同的东西。对于 nn 位比特,可以表示 2n2^n 种可能性,因为每个位可以是 0 或 1,组合总数为 2n2^n。这也限制了能表示的信息量。
表示精度的限制
一些表示因其特性受到限制。例如:
- 十进制格式中,三分之一无法精确表示,因为小数点后有无限个 3。
- 同样,二进制格式中也无法精确表示三分之一,因为无法将其表示为有限个 2 的幂之和。
- 但在三进制中,三分之一可以精确表示为 0.130.1_3,其中小数点后的 1 表示 3−13^{-1}。
总结
数据的表示方式因物理限制和表示精度而受到约束。在讨论文件大小和存储能力时,理解这些单位及其近似值非常重要。此外,理解比特和字节的差异,以及在不同上下文中的单位使用规范,对于正确解读计算机科学中的数据表示至关重要。
注释与参考文献
- 模拟(Analog) 详见 Wiktionary。
- 实际情况更为复杂,因为某些设备(包括一些数字广播电台)会混合使用数字和模拟。例如,数字广播可能以数字形式开始(即数字流),随后被转换为无线电波传输,然后被接收并转换回数字形式。从技术上讲,这种信号经历了调制和解调。如果您的计算机上有调制解调器(modem,modulator-demodulator),它执行的功能与此类似。
- 计算机不仅需要数据,还需要一种方法在内部表示算法。有关计算机如何存储算法指令的讨论将在另一章中进行。
- 当然,0 和 1 的表示形式因设备而异。例如,在计算机中,区分 0 和 1 的常用方法是使用不同的电压水平。在光纤电缆中,可以通过光脉冲的有无来区分 0 和 1。在光学存储设备中,可以通过盘片表面反射率的不同位置是否有小“凹点”来区分 0 和 1。
- [1] 你可能见过一些现代艺术作品,整个画布是一种单色。
- [2] 参见一些关于压缩率与图像保真度之间关系的示例。
- [3] 参见相关链接及其示例。
- [4] 关于 CD 工作原理的更多信息可参考。例如,网上有大量关于音频文件、格式、存储介质等的资源。
- 声音频率(Hz,赫兹)是频率的测量单位,广泛用于计算机科学、计算机工程及相关领域(如电气工程)。例如,计算机显示器可能有 60Hz 的刷新率,即每秒重绘 60 次。在音乐中,中央 C 上方的 A 音通常设定为 440 Hz。
- 需要记住,还有 MPEG 视频压缩标准。实际上,MPEG 包含一系列标准;参见维基百科中的“动态图像专家组(Moving Picture Experts Group)”。
- 有关二进制前缀的更多信息,请参见相关文献。
- 对于较小字节数的“整数”值(如百万)与以 10 为幂的数字之间的差异,并不像较大字节数时那么明显。例如:
- 千字节:210=10242^{10} = 1024 字节,比一千多 2.4%。
- 兆字节:220=1,048,5762^{20} = 1,048,576 字节,比一百万多 4.9%。
- 吉字节比十亿多约 7.4%,而太字节比一万亿多约 10%。
在大多数文件大小问题中,我们关心的是近似值,因此误差 2%、5% 或 10% 通常无关紧要。但在实际应用中,这种差异可能会产生影响,因此在处理文件大小问题时,请牢记我们通常是在做近似计算,而不是精确计算。