目标
- 列出计算机中使用的5种不同的数据类型
- 描述不同的数据如何以位模式存储在计算机内部
- 描述整数如何以无符号格式存储在计算机内
- 描述整数如何以符号加绝对值格式存储在计算机中
- 描述整数如何以二进制补码格式存储
- 描述实数如何以浮点格式存储在计算机内
- 描述文本如何通过各种不同的编码系统存储在计算机中
- 描述音频如何通过采样,量化和编码存储在计算机中
- 描述图像如何通过光栅和矢量图模式存储在计算机中
- 描述视频如何以图像随时间变化的表示来存储在计算机中
3.1 数据类型
数据以不同的形式出现:数字,文本,音频,图像和视频
- 工程程序使用计算机的主要目的是处理数字:进行数字运算,求解代数或三角方程,找出微分方程的根等。
- 文字处理程序使用计算机的主要目的是处理文本:调整对齐,移动,删除等。
- 计算机同样也处理音频数据。我们可以使用计算机播放音乐,把声音作为数据输入到计算机中。
- 图像处理程序使用计算机的主要目的是处理图像:创建,收缩,放大,旋转等。
- 计算机不仅能用来播放电影,还能创建五名在电影中所看到的特效
计算机行业术语 “多媒体” 的定义:包含数字,文本,图像,音频和视频的信息
计算机内部的数据
所有计算机外部的数据都采用统一的数据表示法转换后存入计算机中,当数据从计算机输出时再还原回来。这种通用的格式称作位模式
1.位(bit,binary digit的缩写)
- 是存储在计算机中的最小单位,它是0或1
- 位代表设备的某一状态,这些设备只能处于两种状态之一。例如:开关要么合上要么断开。用1表示合上状态,0表示断开状态。电子开关就表示一个位,换句话说,一个开关能存储一个位的信息。
如今,计算机使用各种双态设备来存储数据
2.位模式
为了表示数据的不同类型,应该使用位模式,它是一个序列,有时也称为位流。
上图展示了由16个位组成的位模式。它是0和1的组合。这意味着,如果我们需要存储一个由16位组成的位模式,需要16个电子开关,如果我们要存储1000个位模式,每个16位,那么需要16000个开关。
- 通常长度为8的位模式被称为1字节
- 有时字可以指代更长的位模式
属于不同数据类型的数据可以以同样的模式存储于内存中
3.数据压缩
为占用较少的内存空间,数据在存储到计算机之前通常被压缩。
4.错误检测和纠正
在本专栏的名词解释中讨论
3.2 存储数字
在存储到计算机内存之前,数字被转换到二进制系统。
但是有两个问题需要解决:
- 如何存储数字中的符号
- 如何显示十进制小数点
3.2.1 存储整数
整数可以被当作小数点位置固定的数字:小数点固定在最右边。
因此,我们用定点表示法存储整数,这种表示法,小数点是固定的,但并不存储
为了更有效地利用计算机内存,无符号和有符号整数在计算机中存储方式是不同的。
1.无符号整数
无符号整数只包括0和正数的非负整数。范围介于0到无穷大。
但是计算机不可能表示这个范围所有整数,通常,计算机都定义了一个常量,称为最大无符号整数。它的值是2n-1。n是计算机分配用于表示无符号整数的二进制位数
(1)存储无符号整数
输入设备存储无符号整数的步骤:
- 首先将整数变成二进制数
- 二进制位数不足n位的,在二进制左边补0,使总位数到n位。
- 如果位数大于n位,该整数无法存储。导致溢出情况发生。
(2)译解无符号整数
输出设备译解内存中位模式的位串并转换为一个十进制无符号整数。
(3)溢出
因为存储单元的位的数量的限制,可以表达的整数范围是有限的。在n位的存储单元,我们可以存储的无符号整数为0 ~ 2n-1之间。
对于超出存储单元范围的整数,我们舍去最左边的位,只保留最右边的n位
上图显示存储大于4位内存单元的整数发生的情况。存储11到这个存储单元,又加9,就发生了溢出。20 = (10100)2,所以保留最右边4位,(0100)2
(4)无符号整数的应用
无符号整数可以提高存储的效率,因为不必存储整数的符号。
- 计数: 我们计数时,不需要负数。
- 寻址: 地址都是从0(存储器第一个字节)开始到整个存储器的总字节数的正数,这里也不需要用到负数。
- 存储其它数据类型: 其它数据类型(文本,图像,音频和视频)是以位模式存储的,可以翻译为无符号整数。
2.符号加绝对值表示法
符号加绝对值格式在存储整数不常用,但用于在计算机中存储部分实数。
符号加绝对值表示法: 用于无符号整数的有效范围(0~2n-1)被分成两个相等的子范围,前半个表示正整数,后半个表示负整数。
上图表示n为4的存储单元,其范围是0000~1111,这个范围分成两半:0000 ~ 0111和1000 ~ 1111
注: 负数出现在正数的右边,且该系统中有两个0:正0(0000)和负0(0000)
用符号加绝对值格式存储一个整数,需要用1个二进制位表示符号(0表示正,1表示负)。
这意味在一个8位存储单元中,用7位表示数字的绝对值(不带符号)。因此,最大的正数值是无符号最大数的一半。
n位单元可存储的数字范围: -(2n-1-1)~ + (2n-1-1), 最左位用于存储符号(0正,1负)
(1)符号加绝对值表示法的溢出
有符号的整数也会溢出。分正负两种溢出情况。
上图显示4位内存单元存储一个用符号加绝对值表示法的整数时出现的两种溢出。
例如: 保存整数5在存储单元又再加上6。期望是11,计算机响应是-3。
保存整数-5在存储单元,减去7,期望-12,响应为+6。
计算机内读取无符号整数时可以识别出正负,计算时却不会识别正负。
(2)符号加绝对值表示法的应用
- 符号加绝对值表示法不用于存储整数,而用于存储部分实数。
- 符号加绝对值表示法通常用于采样模拟信号,例如:音频
3.二进制补码表示法
几乎所有计算机都使用二进制补码表示法来存储位于n位存储单元中的有符号整数。因为它可以将减法运算转换为对减数的补数的加法运算。
什么是补码算术运算?
一个数与它的补数之和是一个常数。
(1) 十进制中的补数
例如:采用十进制进行计数的情况下,如果两个使用n位十进制位表示的数字之和10n,那我们称这两个数互为补数;
- 1 和 9 都是使用1个十进制位表示的,它们和是10,互为补数;
- 11 和 89 使用2个十进制位表示,和是100,互为补数
一般地,在我们限定了使用n个十进制位来表示数字之后,可以通过下边两个步骤来求一个数Q的补数:
- 先计算由n个9组成的十进制数字(其实也就是10n - 1)减去该数的值(此过程不涉及借位)。
- 然后将上一步骤的结果加1。
本质: Q的补 = 10n - Q = [ (10n - 1) - Q ] + 1
利用补数将减法转换为加法
我们为什么要研究补码算术,就是因为减一个数等于加上这个数的补数。 这样可以把减法转换为加法。
做法: 在做使用n个十进制位表示的数字之间的减法操作时,减去一个数等于加上这个数的补数然后再减去10n,(减去10n的操作其实就相当于直接把和的进位忽略掉,得到的就是原减法的结果。)
实质: Q - P = Q -(10n - P的补数)= Q + P的补数 - 10n
(2)二进制的补数
同样的,在n位二进制算术中,数P的补数为Q且P+Q = 2n。
求一个数补数的Q = 2n - P = [ (2n - 1) - Q ] + 1
二进制运算中我们需要引入一种运算:反码(也叫取一个整数的反码)。
该运算可以应用到任何整数,无论正负。该运算简单反转各个位,即把0位变为1位,把1位变为0位。
仔细观察我们发现,数Q和它的反码P相加的值为2n-1,即反码P = (2n-1) - Q。
由此我们可以推出数Q的补码Z: Z = Q的补码 + 1
即:在二进制算术中,求一个数补数的方法是将其各位取反并加1
二进制将减法变加法: Q - P = Q -(2n - P的补数)= Q + P的补数 - 2n
结果忽略最左边的一位进位(也叫“进位位”)
二进制补码表示法: 无符号整数的有效范围(0~2n-1)被分成两个相等的子范围。第一个表示非负整数,第二个子范围用于表示负整数。
以二进制补码格式存储整数
以二进制补码格式存储整数,计算机遵循以下步骤:
- 将整数变成 n 位二进制数
- 如果整数是正数或0,原样存储;如果是负数,取其补码存储。
从二进制补码格式还原整数
- 如果最左边是1,计算机取其补码。如果最左边是0,计算机不进行操作。
- 计算机将该整数转换为十进制。
注: 计算机中存储的整数都是整数的二进制补码
(3)二进制补码表示法的溢出
上图显示当使用4位存储单元存储一个带符号的整数时出现的正负两种溢出。
(4)二进制补码表示法的应用
二进制补码表示法是计算机用于存储整数的标准表示法。
3.2.2 实数
实数是带有整数部分和小数部分的数字。
使用固定小数点的表示法表示实数容易使精度受损
1.浮点表示法
用于维持正确度或精度的解决方法是使用浮点表示法
- 该表示法允许小数点浮点
- 这种方法极大增加了可存储的实数范围
浮点表示法中(无论十进制还是二进制),一个数字都由三部分组成:
- 符号:可正可负
- 位移量:显示小数点应该左右移动的位数
- 定点数:小数点位置固定时候的数字
浮点表示法在科学中用于表示很大或很小的十进制数。
科学计数法: 定点部分在小数点左边只有一个数码,而且位移量是10的幂次。
类似方法可以用于表示很小或很大的存储于计算机中的二进制数字(整数和实数都可以)
2.规范化
规范化: 为了使表示法的固定部分统一,在小数点左边使用唯一的非零数码。十进制系统中的数码可能是1~9,而二进制只能是1。
3.符号,指数和尾数
在一个二进制数规范化之后,我们只存储一个数的三部分信息:符号,指数和尾数
符号: 一个数的符号可以用一个二进制位来存储(0或1)
指数(2的幂): 定义小数点移动的位数。幂可以为正也可以为负。余码表示法是用来存储指数位的方法。
尾数: 指小数点右边的二进制数。尾数作为无符号整数存储
4.余码系统
尾数作为无符号数存储。指数用余码系统的新的表示法来存储。
余码表示法:
- 在该系统中,正的和负的整数都可以作为无符号数存储。
- 为了表示正的或负的整数,一个正整数(称作偏移量) 加到每个数字中,将它们统一移到非负的一边。
- 偏移量的值是2m-1-1,m是存储单元存储指数的大小。
举例:
我们用4位存储单元表示16个整数。使用一个单元为0,作为-7~8的分割。在该范围加上7个单位到每个整数上,统一将所有整数变为非负数。新系统被称为余7,或者偏移量为7的偏移表示法。
如此在新系统中,只要将一个整数减去它的偏移量就可以得到原来的数。
5.IEEE标准
电气和电子工程师协会(IEEE)已定于了几种存储浮点数的标准。这里讨论两种最常用的——单精度和双精度。
单精度数格式: 采用总共32位来存储一个浮点表示法的实数。符号占用1位(0正,1负),指数占用8位(使用偏移量127),尾数使用23位(无符号数)。 该标准也称为余127码,因为偏移量是127。
双精度数格式: 采用总共64位来存储一个浮点表示法的实数。符号占用1位(0正,1负),指数占用11位(使用偏移量1023),尾数使用52位(无符号数)。 该标准也称为余1023码,因为偏移量是1023。
6. IEEE标准浮点数的存储
一个实数存储为IEEE标准浮点数格式:
- 在S中存储符号(0或1)
- 将数字转换为二进制
- 规范化
- 找到 E(E = 指数 + 127或1024 ) 和 M 的值
- 连接 S , E 和 M
7.将存储为IEEE标准浮点数的数字还原
一个IEEE浮点格式之一存储的数字还原步骤:
- 找到S , E 和 M 的值
- 如果找到S = 0,将符号设为正号,否则设为负号
- 找到位移量(E - 127或1024)
- 对尾数去规范化
- 将去规范化的数字变为十进制以求出绝对值。
- 加上符号
8.上溢和下溢
对于浮点数,有上溢和下溢两种情况。该表示法不能存储很小或很大数字的绝对值。
上溢: 试图存储绝对值很大的数
下溢: 试图存储绝对值很小的数
9.存储0
实数0.0无法用以上步骤存储。为了处理这个特例,约定符号,指数和尾数都为0时表示实数0.0。
10.截断错误
截断错误: 原始数字与还原后数字的差异
例如:假定我们需要在内存中用余127码表示存储这个数字:
(1111111111111111.11111111111)2
规范化之后得到:
(1.11111111111111111111111111)2
这意味着尾数有26个1,但是余127码的尾数位数只有23位 ,所以存储在计算机中的是:
(1.111111111111111111111111)2 原来的数变为:
(1111111111111111111111.111)2
小数部分右边被截去了3个1。
3.3 存储文本
任何语言中,文本的片段是用来表示语言中某个意思的一系列符号。 例如:英语中用26个符号来组成各种单词,从而构成各种句子。
我们可用位模式表示任何一个符号。如4个符号组成的文本“CATS”能用4个n位模式表示。
一种语言中,位模式到底需要多少位来表示一个符号?
这主要取决于语言集中有多少不同的符号。例如:英文字母只需要26个符号。相应地,其位模式至少需要能表示26个符号。
不同的位模式集合被设计用于表示文本符号。其中每一个集合我们称为代码。表示符号的过程为编码。
3.4 存储音频
音频表示声音或音乐。
音频本质上与数字和文本是不同的。 文本由可数的实体(文字)组成:我们可以数出文本中文字的数量。
相反,音频是不可数的。 音频是随时间变化的实体,我们只能在每一时刻度量声音的密度。
我们讨论用计算机内存存储声音时,是指存储一个音频信号的密度。例如:每隔一段时间(一秒,一小时)来自麦克风的信号
音频是模拟数据的例子。即使我们能在一段时间内度量所有的值,也不能把它全存在计算机内存中,这需要无限数量的内存单元。
3.4.1 采样
我们不能记录一段间隔的音频信号的所有值,但我们可以记录其中一些。
采样: 在模拟信号上选择数量有限的点取它们的值并记录下来。
采样率 = 样本总数 / 采样时间
我们每秒需要多少样本才能还原出原始信号的副本?
每秒40000个样本的采样率对音频信号是足够的。
3.4.2 量化
从每个样本测量来的值是真实的值。
量化: 将样本的值截取为最接近的整数值的一种过程。
例如:实际值为17.2,截取为17;如果值为17.8,截取为18。
3.4.3 编码
编码: 量化的样本值需要被编码成位模式。
有两种编码方式:
1.无符号整数表示样本
2.符号加绝对值表示样本
1.每样本位
每样本位: 每个样本系统分配的位数。每样本位的数量也可以叫位深度。
2.位率
如果我们称位深度或每样本位的位数为B,每秒样本数为S,我们需要为每秒的音频存S×B位。该乘积被称为位率
位率: 每样本率和样本的乘积。
例如:我们使用每秒40000个样本以及每样本16位,
位率 R = 40000 × 16 = 64000 b/s = 640 KB/s。
3.4.4 声音编码标准
3.5 存储图像
存储在计算机中的图像使用两种不同的技术:光栅图或矢量图
3.5.1 光栅图(位图)
一张照片由模拟数据组成,类似于音频信息。不同的是数据密度(色彩)因空间变化,而不是因时间变化。
这意味数据需要采样。这种情况下的采样被称作扫描, 样本称为像素(代表图像元素)。整个图像被分成小的像素,每个像素假定有单独的密度值。
1.解析度
解析度(扫描率): 每英寸的方块需要多少像素
2.色彩深度
色彩深度: 一个像素位的数量。
我们眼睛有不同类型的感光细胞:一些响应红,黄,蓝三原色(RGB);另一些仅响应光的密度
(1)真彩色
用于像素编码的技术之一。它使用24位来编码一个像素。 每个三原色都表示8位(0~255)。所以每种色彩都由0 ~ 255之间的三维数字表示。
注: 真彩色模式可以编码224(16777216)种颜色。各个像素的色彩深度是这些值的其中一个。
(2)索引色
真彩色模式使用超过1600万种颜色。许多应用程序不需要如此大的颜色范围。
索引色(调色板色): 仅仅使用其中一部分。
该模式下,每个应用程序从大的色彩集中选择一些颜色(通常是256种)建立索引。对选中的颜色赋一个0~255之间的值。
对索引的使用减少了需要存储一个像素需要的位的数量。真彩模式需要24位存储一个像素,而索引色模式通常使用256个索引,只要8位存储通用的像素。
例如:一部高质量数码相机要300万像素拍摄一张3×5英寸的相片
真彩色: 3 000 000 × 24 = 72 000 000
索引色: 3 000 000 × 8 = 24 000 000
3.图像编码标准
3.5.2 矢量图
光栅图的两个缺点:
1.文件体积太大
2.重新调整图像大小有点麻烦
放大光栅图意味着扩大像素,所以放大后的图像看上去很粗糙
矢量图图像编码:
- 并不存储每个像素的位模式。一个图像被分解为几何图形的组合。 例如:线段,矩形或圆形。
- 每个几何图形由数学公式表示。 矢量图是由定义如何绘制这些形状的一系列命令构成的。
- 当要显示或打印图像时,将图像的尺寸作为输入传给系统。系统重新设计图像大小并用相同的公式画出图像。
- 每一次绘制图像,公式也将重新估算一次。因此,矢量图也被称为几何模型或面向对象图形
矢量图不适合存储照片图像的细微精妙。矢量图适合应用程序采用主要的几何图形来创建图像。
应用: 创建字体,工程绘图等
3.6 存储视频
视频是图像在时间上的表示。 换言之,视频是随空间(单个图像) 和时间(一系列图像) 变化的信息表现。
所以,知道如何将一幅图像存储在计算机中,就知道如何存储视频;每一幅图像或帧转化成一系列位模式并存储,这些图像组合起来就可表示视频。