@xudongh
2016-09-18T18:12:12.000000Z
字数 10281
阅读 2745
计算机
学习
图灵机:设想所有的计算都可能在一种特殊的机器上执行。
数据处理器:一个接收输入数据、处理数据并产生输出数据的黑盒。
图灵模型是一个使用于通用计算机的更好的模型。该模型添加了一个额外的元素——程序到不同的计算机中。
程序是用来告诉计算机对数据进行处理的指令集合。
输出数据是依赖两方面因素的结合作用:输入数据和程序。
通用图灵机是对现代计算机的首次描述,该机器只要提供合适的程序就能做任何运算。
基于通用图灵计算机建造的计算机都是在存储器中存储数据。冯·诺依曼提出,鉴于程序和数据在逻辑上是相同的,因此程序也能存储在计算机的存储器中。
基于冯·诺依曼模型建造的计算机分为4个子系统:存储器、算术逻辑单元、控制单元、输入/输出单元。
现代计算机的存储单元主要用来存储程序及其响应数据。这意味着数据和程序应该具有相同的格式,因它们都储存在存储器中,实际上它们都以位模式(0和1序列)存储在内存中的。
冯·诺依曼模型中的一段程序是由一组数量有限的指令组成。按照这个模型,控制单元从内存中提取一条指令,解释指令,接着执行指令。指令的顺序执行是基于冯·诺依曼模型的计算机的初始条件。当今的计算机以最高效的顺序来执行程序。
可以认为计算机由3大部分组成:计算机硬件、数据、计算机软件。
当今计算机硬件基于冯·诺依曼模型,包含四部分。
冯·诺依曼模型讲一台计算机定义为一台数据处理机。
编程在早期的计算机中体现为对系统开关的开闭合和配线的改变。
数字系统(或数码系统)定义了如何用独特的符号来表示一个数字。
可分为两类:位置化系统、非位置化系统。
位置化数字系统中,在数字中符号所占据的位置决定了其表示的值。在该系统中,数字这样表示:
它的值是:
其中,S是一套符号集,b是底(或基数),它等于S符号集中的符号总数,其中只该符号的位置是,±符号表示该数字可正可负。
位置化数字系统就是进位制。以87.53举例,公式①相当于直接写成87.53的形式;而公式②就是写成:
十进制系统,底b=10,符号集是S={0,1,2,3,4,5,6,7,8,9},该系统中的符号常被称为十进制数码或数码。
计算机存储正负数的方式不同。
整数表示为:
底b=2,S={0,1}。该系统中的符号常被称为二进制数码或位(位数码)。
数码k表示的二进制整数的最大值是,如k=5,那么这个最大值就是31。
底b=16,字符集S={0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}。
符号A,B,C,D,E,F分别等于10,11,12,13,14,15。该系统中的符号称为十六进制数码。
与以上进制系统同理。
十进制 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 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 |
(1)转换整数部分
举例:将十进制数35转换为二进制数。
从这个十进制数开始,一边连续寻找除以2得到的商和余数,一边左移。结果是。
0 ← 1 ← 2 ← 4 ← 8 ← 17 ← 35 十进制 ↓ ↓ ↓ ↓ ↓ ↓ 1 0 0 0 1 1 二进制
(2)转换小数部分
举例:将0.634转换成八进制且精确到小数4位。
从这个十进制数开始,连续乘8,并记录结果的整数和小数部分,。小数部分移到右边,整数部分写在每次运算的下面。当小数部分为0,或达到足够的位数时结束。结果是。
十进制 0.634 → 0.072 → 0.576 → 0.608 → 0.864 ↓ ↓ ↓ ↓ 八进制 5 0 4 4
可以轻松将数字在二进制和十六进制之间转换。因为在这两个进制之间存在一种关系:二进制的4位恰好是十六进制中的1位。
举例:将二进制数 转换为十六进制数字。
先将二进制数从右边开始排为4位一组的形式:100 1110 0010。再根据上表对照每组的值等量转换得到十六进制数字。
二进制的3位恰好是八进制中的1位。因此转换方式与二进制-十六进制的转换方式相同。
使用二进制系统作为中介系统进行转换。
非位置化数字系统并不用在计算机中。
非位置化数字系统仍然使用有限的数字符号,每个符号有一个值,但是符号所占用的位置通常与其值无关——每个符号的值是固定的。为求出该数字的值,把所有符号表示的值相加即可。该系统数字表示为:
罗马数字是非位置化数字系统的一个好例子。该数字系统有一套符号S={I,V,X,L,C,D,M}。
符号 | I | V | X | L | C | D | M |
---|---|---|---|---|---|---|---|
值 | 1 | 5 | 10 | 50 | 100 | 500 | 1000 |
所有计算机外部的数据类型的数据都采用统一的数据表示法转换后存入计算机中,当数据从计算机输出时再还原回来。这种通用的格式称为位模式。
位(bit,binary digit的缩写)是存储在计算机中的最小单位,它是0或1。位代表设备的某一状态,这些设备只能处于两种状态之一。
位模式是一个序列,有时也称为位流。
下面为由16个位组成的位模式:
1 0 0 0 1 0 1 0 1 1 1 1 1 1 1 1
通常长度为8的位模式被称为1个字节(byte)。
属于不同数据类型的数据可以以相同的模式存储于内存中。如果使用文本编辑器,键盘上的字符A可以以8位模式01000001存储;如果使用数学程序,同样的8位模式可以表示数字65;类似地,同样的位模式可表示部分图像、部分音频等等。计算机内存存储所有这些而无需辨别它们表示的是何种数据类型。
在存储到计算机内存中之前数字被转换为二进制系统。这有两个问题:
1)如何存储数字的符号;
2)如何显示十进制小数点。
对于小数点,计算机使用两种不同的表示方法:定点和浮点。第一种用于把数字作为整数存储,第二种把数字作为实数存储。
整数通常使用定点表示法存储在内存中。
无符号整数就是没有符号的整数。
计算机都定义了一个最大无符号整数的常量,称为最大无符号整数,它的值是。这里n就是计算机中分配用于表示无符号整数的二进制位数。
(1)存储无符号整数
首先将整数变成二进制数;
如果二进制位数不足n位,则在二进制整数的左边补0,使它的总位数为n位。如果位数大于n,该整数无法存储,导致溢出的情况发生。
(2)译解无符号整数
输出设备译解内存中位模式的位串并转换为一个十进制的无符号整数。
(3)溢出
因为大小(即存储单元的位的数量)的限制,可以表达的整数范围是有限的,在n位存储单元中,我们可以存储的无符号整数仅为到之间。
(4)无符号整数的应用
无符号整数表示法可以提高存储的效率,因为不必存储整数的符号,这就意味着所有分配的位单元都可以用来存储数字。只要用不到负整数,都可以用无符号整数表示法。
该表示法用于在计算机中存储部分实数。
在这种方法中,勇于无符号整数的有效范围(0到2^n-1)被分成2个相等的子范围。前半个表示正整数,后半个表示负整数。
注意:
- 负数出现在正数的右边;
- 该系统中有两个0:正0(0000)和负0(1000)。
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1011 1100 1101 1110 1111 0 1 2 3 4 5 6 7 -0 -1 -2 -3 -4 -5 -6
用符号加绝对值格式存储一个整数,需要用1个二进制位表示符号(0表示正,1表示负),这就意味着在一个8位存储单位中,可以仅用7位表示数字的绝对值。因此,最大的正数值仅是无符号最大数的一半。在n位但愿可存储的数字范围是至。
在符号加绝对值格式表示法中,最左位用于定义整数的符号。0表示正整数,1表示负整数。
符号加绝对值表示法不用于存储整数,而用于存储部分实数,通常也用于采样模拟信号(如音频等)。
几乎所有等俄计算机都使用二进制补码表示法来存储位于n位存储单元中的有符号整数。
无符号整数的有效范围(到)被分为2个相等的子范围,第一个子范围用来表示非负整数,第二个子范围用来表示负整数。
1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
最左位决定符号,0表示正,1表示负。
(1)两种运算
① 反码:反转各个位,即把0位变成1位,把1位变成0位。
② 补码:首先,从右边复制位,直到有1被复制;接着,反转其余的位。
(2)以二进制补码格式存储整数
- 将整数变成n位的二进制数;
- 如果整数是正数或零,以其原样存储;如果是负数,计算机取其补码存储。
(3)从二进制补码格式还原整数
- 如果最左位是1,计算机取其补码。如果最左位是0,计算机不进行操作。
- 计算机将该整数转换为十进制。
例子:用二进制补码表示法将整数-28存储在8位存储单元中。
该整数是负数,因此在转换成二进制后计算机对其进行二进制补码运算。
把28变为8位的二进制 0 0 0 1 1 1 0 0 ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ 进行补码运算 1 1 1 0 0 1 0 0
二进制补码表示法仅有一个0。
(5)应用
二进制补码表示法是计算机中用于存储整数的标准表示法。
存储单元的内容 | 无符号 | 符号加绝对值 | 二进制补码 |
---|---|---|---|
0000 | 0 | 0 | +0 |
0001 | 1 | 1 | +1 |
0010 | 2 | 2 | +2 |
0011 | 3 | 3 | +3 |
0100 | 4 | 4 | +4 |
0101 | 5 | 5 | +5 |
0110 | 6 | 6 | +6 |
0111 | 7 | 7 | +7 |
1000 | 8 | -0 | +8 |
1001 | 9 | -1 | -7 |
1010 | 10 | -2 | -6 |
1011 | 11 | -3 | -5 |
1100 | 12 | -4 | -4 |
1101 | 13 | -5 | -3 |
1110 | 14 | -6 | -2 |
1111 | 15 | -7 | -1 |
实数是带有整数部分和小数部分的数字。
带有很大的整数部分或很小的小数部分的实数不应该用定点表示法存储。
浮点表示法允许小数点浮动,极大地增加了可存储的实数范围,带有很大的整数部分或很小的小数部分的实数可以存储在内存中。
在浮点表示法中,无论十进制还是二进制,一个数字都由3部分组成:符号、位移量、定点数。
符号
位移量
定点数
浮点表示法在小数点左边使用了唯一的非零数码。十进制系统中的数码可是1到9,二进制系统中该数码是1。
十进制 → d.xxxxxxxxxx (1≤d≤9)
二进制 → 1.yyyyyyyyyy
在一个二进制数规范化之后,只存储了该数的3部分信息符号、指数和尾数(小数点右边的位)。
- 符号:0表示正号,1表示符号;
- 指数:幂可正可负,余码表示法是用来存储指数位的方法;
- 尾数:小数点右边的二进制数,定义了该数的精度,是作为符号加绝对值格式的整数存储的。尾数的右边插入零,会改变该值。
例如,+1000111.0101规范化后变成:
+ 2^6 × 1.0001110101
+ 6 0001110101
↑ ↑ ↑
符号 指数 尾数
注意小数点和定点部分左边的位1并没有存储,它们是隐含的。
在该余码系统中,正的和负的整数都可以作为无符号数存储。
为了表示正的或负的整数,将正整数(成为一个偏移量)添加到每个数字中,将他们统一移到非负的一边。
这个偏移量的值是,m是内存单元存储指数的大小。
电气和电子工程师协会(IEEE)定义了几种存储浮点数的标准,最常用的两种:单精度、双精度。
单精度采用总共32位来存储一个浮点表示法的实数。
符号使用1位,指数使用8位(使用偏移量127),尾数使用23位(无符号数)。
该标准也称为余127码(Excess_127):
余127码 【符号】 【指数】 【尾数】
位数 1 8 23
双精度采用总共64位来存储一个浮点表示法的实数。
符号使用1位,指数使用11位(使用偏移量1023),尾数使用52位(无符号数)。
该标准也称为余1023码(Excess_1023):
余1023码 【符号】 【指数】 【尾数】
位数 1 11 52
参数 | 单精度 | 双精度 |
---|---|---|
内存单元大小(位数) | 32 | 64 |
符号大小(位数) | 1 | 1 |
指数大小(位数) | 8 | 11 |
尾数大小(位数) | 23 | 52 |
偏移量(整数) | 127 | 1023 |
① 在S中存储符号;
② 将数字转换为二进制;
③ 规范化;
④ 找到E和M的值;
⑤ 连接S,E和M。
例:写出十进制5.75的余127码(单精度)表示法。
① 符号为正,S=0;
② 十进制转换为二进制: ;
③ 规范化:;
④ ,。需要在M的右边增加19个0使之成为23位。
⑤ 连接S、E、M,得。
① 找到S、E和M;
② S=0,符号为正号,否则为负号;
③ 找到位移量;
④ 对尾数去规范化;
⑤ 将去规范化的数字变为十进制以求出绝对值;
⑥ 加上符号。
规定存储零时,符号、指数和尾数都设为0。
原始数字和还原后数字的差异称为截断误差。
在一种语言中,位模式需要多少位来表示一个符号,取决于该语言集里有多少不同的符号。
位模式的长度取决于符号的数量,它们的关系不是线性的,而是对数的关系。
位模式的长度 | 符号的数量 |
---|---|
1 | 2 |
2 | 4 |
3 | 8 |
4 | 16 |
7 | 128 |
8 | 256 |
16 | 65536 |
32 | 4294967296 |
代码:不用的位模式集合被设计用于表示文本符号,每一个集合成为代码。
编码:表示符号的过程称为编码。
- ASCII:美国信息交换标准码,该代码使用7位表示符号。
- Unicode:由硬件和软件制造商联合设计,使用32位表示符号。
- 其他编码。
音频是模拟数据,不可能将一段时间度量的而所有值存储到计算机中。
采样指在模拟信号上选择数量有限的点来度量它们的值并记录下来。
采样率指每秒采取的样本数量。
量化指将样本的值截取为最接近的整数值的一种过程。如实际值为17.2,就可截取为17。
量化的样本值需要被编码成位模式。
每个样本系统分配多少位。每样本位的数量也称为位深度。
位深度或每样本位的数量为B,每秒样本数为S,则需要为每秒的音频存储S×B位,该乘积称为位率R。
当前音频编码的主流标准式MP3(MPEG Layer 3的简写),每秒44100个样本以及每样本16位,信号达到705600b/s的位率。
采样称为扫描;样本称为像素。
在图像处理中,每英寸的方块或线条记录多少像素,扫描率称为解析度。
色彩深度指用于表现像素的位的数量。
矢量图图像编码方法并不存储每个像素的位模式,而是有绘制这些图像的形状的一系列命令构成的。
矢量图也称为几何模型或面向对象图形。
逻辑运算是指那些应用于模式中的一个二进制位,或在两个模式中相应的两个二进制位的相同基本运算。
布尔代数,逻辑的特殊数学领域。
4种用来操纵二进制位的位层次上的运算:非(NOT)、与(AND)、或(OR)、异或(XOR)。
NOT运算符是一元运算符:只有一个输入。
x | NOT x |
---|---|
0 | 1 |
1 | 0 |
AND运算符是二元运算符:有两个输出。
x | y | x AND y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
如果输入中有一位是0,则不需要检查其他输入的相应的位便可迅速得到结果为0。
OR运算符是二元运算符。
x | y | x OR y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
如果输入中有一位是1,则不需要检查其他输入的相应的位便可迅速得到结果为1。
XOR运算符是二元运算符。
x | y | x XOR y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
当输入相同时,则输出为0;当输入不同时,则输出为1。
如果输入中的一位是1,那结果就是与其他输入中相应位相反。
相同的4个运算符可以被应用到n位模式,效果就是对NOT运算来说,把每个运算符应用于每个位;对于其他3个运算符就是每个运算符应用于相应的位对。
NOT运算符的唯一应用就是对整个模式求反。
AND运算符的一个应用是把一个位模式的指定位复位(置0)。这种情况下第二个输入称为掩码。
掩码中的0位对第一个输入中相应的位进行复位。掩码中的1位使得第一个输入中相应的位保持不变。
1 0 1 0 0 1 1 0 输入
AND 0 0 0 0 0 1 1 0 掩码
0 0 0 0 0 1 1 0 输出
OR运算的一个应用是吧一个位模式的指定位置位(置1)。
掩码中的1位对第一个输入中相应的位进行置位。掩码中的0位使得第一个输入中相应的位保持不变。
1 0 1 0 0 1 1 0 输入
OR 1 1 1 1 1 0 0 0 掩码
1 1 1 1 1 1 1 0 输出
移位运算移动模式中的位,改变位的位置,可以向左或向右移动位。
移位运算分成两大类:逻辑移位运算、算术移位运算。
逻辑移位运算应用于不带符号位的数的模式。原因是这些移位运算可能会改变数的符号。
逻辑右移运算把每一位向右移动一个位置。在n位模式中,最右边被丢弃,最左位填0。
逻辑左移运算把每一位向左移动一个位置。在n位模式中,最左位被丢弃,最右位填0。
逻辑右移 0→□□□□□□→丢弃
逻辑左移 丢弃←□□□□□□←0
循环移位运算(旋转运算)进行移位,没有位被丢弃或增加。
循环右移(或右旋转)把每一位向右移动一个位置,最右位被回环,成为最左位。
循环左移(或左旋转)把每一位向左移动一个位置,最左位被回环,成为最右位。
算术移位运算假定位模式是用二进制补码格式表示的带符号位的整数。算术右移被用来对整数除以2;而算术左移被用来对整数乘以2。
算术右移保留符号位,但同时也把它复制,放入相邻的右边的位中,因此符号被保存。
算术左移丢弃符号位,接受它的右边的位作为符号位。如果新的符号位与原先的相同,那么运算成功,否则发生上溢或下溢,结果是非法的。
算术右移 复制最左位→□□□□□□→丢弃
算术左移 丢弃←□□□□□□←0
算术运算包括加、减、乘、除等,适用于整数和浮点数。
整数通常是以二进制补码形式存储的,它的一个优点是加法和减法之间没有区别。当遇到减法运算时,可转变为加法:
二进制补码中的加法就像十进制中的加法一样:列与列相加,如果有进位,就加到下一列上。但是,最后一列的进位被舍弃。
例:以二进制补码格式存储两个整数A和B,显示如何从A中减去B。。
A减去B相当于A加上B的补码:
0 0 0 1 1 0 0 0 A
+ 0 0 0 1 0 0 0 1 B的补码
0 0 1 0 1 0 0 1 结果
用十进制检查结果,(+24)-(-17)=(+41)
当进行计算机数字中的算术运算时,要记住每个数字和结果应该在分配的二进制位的定义范围之内。
用符号加绝对值表示的整数的加法和减法比较复杂。
算术运算能应用于用浮点数格式存储的实数上。
以浮点数格式存储的实数的加法和减法被简化为小数点对齐后以符号加绝对值格式(符号和尾数的组合)存储的两整数的加法和减法。
例:显示计算机是如何计算结果的:(+5.75)+(+161.875)=(+167.625)
这两个数以浮点数格式存储的。
数字 | S | E | M |
---|---|---|---|
A | 0 | 10000001 | 01110000000000000000000 |
B | 0 | 10000110 | 01000011110000000000000 |
给尾数增加隐含的1,增加指数进行去规范化。两个去规范化后的尾数都是24位,包含了隐含的1,他们应该被存储在有24位的存储单元中。每个指数都被增加了。
数字 | S | E | 去规范化的M |
---|---|---|---|
A | 0 | 10000010 | 101110000000000000000000 |
B | 0 | 10000111 | 101000011110000000000000 |
对齐尾数。把第一个指数改为,所谓需要把尾数右移5位。
数字 | S | E | 去规范化的M |
---|---|---|---|
A | 0 | 10000111 | 000001011100000000000000 |
B | 0 | 10000111 | 101000011110000000000000 |
进行绝对值加法。
数字 | S | E | 去规范化的M |
---|---|---|---|
R | 0 | 10000111 | 101001111010000000000000 |
规范化。
数字 | S | E | 去规范化的M |
---|---|---|---|
R | 0 | 10000110 | 01001111010000000000000 |