没有合适的资源?快使用搜索试试~ 我知道了~
计算机系统概论第二章.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 150 浏览量
2021-10-11
17:31:43
上传
评论
收藏 108KB PDF 举报
温馨提示
试读
17页
计算机技术
资源推荐
资源详情
资源评论
第二章 比特,数据类型和运算
2.1 比特和数据类型
2.1.1 信息的最小单位 —— 比特
我们在第一章中提到, 计算机是一个由多个层次组织起来的系统。 在计算机中通过电子
的流动,一个用自然语言描述的问题可以轻而易举的得到解决。
在计算机的内部, 数以亿计非常微小、 快速的元件控制着电子的流动。 这些元件对电路
中电压的有无做出反应。 事实上, 它们可以对电压具体的数值做出反应, 而不仅仅是对电压
的有无做出反应。 但是这样会使控制电路和探测电路变得非常复杂而没有多少实际用途, 因
此在实际的应用中往往是探测两点之间电压的有无而不是测量电压的具体值。
要明白这些,先想一想家中的插座孔,你可以测量一下两孔间电压具体的值,比如,是
120 伏特呢,还是 115 伏特,或者是 118.6 伏特。但是电路系统只会探测电压是否存在,因
为这样更简单。 如果你想测量电压值, 那么你还需要一组仪器, 而如果想探测电压是否存在,
把你的手指伸进去就足够了。
我们把存在电压用“ 1”表示,而把不存在电压用“ 0”表示,我们称这一个个的“ 0”
和“ 1”为比特( bit),或位 ,是“二进制位 ”(binary digit )的缩写。想想你从小就使用的 0,
1,2,3,4,5,6,7,8,9,它们是十进制数,用十个符号表示,而 二进制 只有两个表示
数的符号: 0 和 1。
更精确的说, 计算机并不是区分电压的绝对不存在 (即 0)和绝对存在 (即 1)。实际上,
计算机的电路区分的是接近 0 的电压和远离 0 的电压。例如,如果计算机把 2.9 伏的电压表
示为 1,把 0 伏的电压表示为 0,那么 2.6 伏的电压也会被视作 1,而 0.2 伏的电压会被当作
0。
计算机要解决一个真正的问题,必须能唯一的识别出许多不同的数值,而不仅仅是 0
和 1。一根线路上的电压只能唯一的表示两个数值中的一个,一个表示为 0,另一个表示为
1。这样, 为了唯一的识别出多个数值, 必须对多个位进行组合。 例如,如果我们用 8 位(对
应 8 根线路上的电压) ,我们就能用 01001110 表示某一个特定值,用 11100111 表示另一个
值。事实上,如果我们使用 8 位,最多能区分出 256(即 2
8
)个不同的值。一般说来,如果
有 k 位,我们最多能区分出 2
k
个不同的值。这些 k 位的每一种组合都是一个编码,对应着
某个特定的值。
2.1.2 数据类型
对于表示同一个数值,存在许多种表示方法。例如,数字 5 可以被写为 5。这是你习惯
的标准的十进制计数法。它也可以被一个人用伸出的手指数来表示,这种方法写下来就是
11111,这种计数法有个名字 —— 一元计数法。罗马字中还有另一种表示 5 的符号 —— 字符
v。我们即将会看到 5 的第四种符号表示是二进制 00000101。
只是简单的表示这些数值还不够, 我们还必须能对这些数值进行运算。 如果在计算机上
能对以某种表示法编码的信息进行运算, 我们就把这种特殊的表示法称为数据类型。 每种指
令集结构都有它自己的数据类型集, 和对那些数据类型进行运算的指令集。 在本书中, 我们
主要使用两种数据类型: 用来表示我们要进行算术运算的正负整数的二进制补码整数, 和用
来表示我们想输入计算机或显示在计算机显示器上的键盘上的字符的 ASCII 码。在后面就
会解释这两种数据类型。
事实上,在大多数计算机上还存在着多种数值表示方法。回忆在中学学习过的 “科学计
数法 ”,它要求你将十进制数 621 表示为 6.21*10
2
。在计算机中,也存在以这种形式表示的
数字, 并且也提供了对这种表示法的数值的运算。 这种数据类型通常被称为浮点数。 我们将
在 2.6 节展示这种表示法。
2.2 整数数据类型
2.2.1 无符号整数
我们即将看到的第一种信息的表示方法, 或数据类型是无符号整数。 无符号整数在计算
机中有很多用途。 如果我们想将某个任务执行有限次, 可以使用无符号整数, 表示该任务已
经执行的次数。计算机中的存储单元的地址,就像房屋的地址一样,可以通过“某大街 129
号”和“某大街 131 号”来区分,也可以使用无符号整数来表示。
首先回忆一下我们日常使用的十进制系统。在一个十进制数 329 中,尽管单独的 3 的
绝对值只是 9 的 1/3,但这里的 3 表示比 9 大得多的值。原因就在于这个 3 在 329 中的位置
决定了它表示 300(3*10
2
),而 9 则表示 9*10
0
。这就是位置计数法,或称为定位数制。在
十进制系统里, 10 被称为数制中的基数或基。
在计算机中,可以使用类似的采用位置计数法的一串二进制数来表示无符号型整数,
不同的是基数为 2,二进制数为 0 和 1。例如:如果我们使用 5 位有效数字来表示我们需要
的数值,则数字 6 可以表示为 00110,即:
0*2
4
+0*2
3
+1*2
2
+1*2
1
+0*2
0
使用 k 位数,就可以表示从 0 到 2
k
-1 共 2
k
个整数。使用 5 位数,可以表示十进制整数
0 到 31。
2.2.2 有符号整数
然而在实际的计算中, 还经常会使用负数, 因此只有无符号整数是不够的。 为了表示有
符号整数,我们可以将 k 位的 2
k
个不同的数字分为两半,一半表示正数,另一半表示负数。
这样, 使用 5 位码字就可以表示从 +1 到+15 的正数, 以及从 -1 到-15 的负数。 这样, 就有 30
个整数被表示出来。 因为 2
5
是 32,那么,还有两个 5 位的码字没有被分配。 其中一个是 00000,
如果将其分配给数值 0,现在,就得到一个从 -15 到+15 的完整的整数值系列。还留下最后
一个数没有分配, 对于如何对其进行分配的问题, 首先需要考虑的是从 +1 到+15,从-1 到 -15,
到底是哪些码字与其一一匹配的?
首先,正数是按照位置计数法直接表示的。因为有 k 位,而且我们想要用 2
k
个码字的
一半来表示从 0 到 2
k-1
-1 的正数,所有的正数在它们的表示法中都会在最高位有一个 0。在
k=5 的情况下,最大的正数 15 使用 01111 来表示。注意在图 2.1 的三种数据类型中, 0 和
所有正数都是以 0 开头。
那么, 负数是如何表示的呢 (在 k=5 的情况下, 从-1 到-15)?通常, 第一个想法就是:
如果最高位为 0 表示是正数, 那么把该数字的最高位设为 1 就表示其对应的负数。 这种表示
法就是原码数据类型,见图 2.1。第二个想法是(这种方法实际上曾经在某些早期的计算机
上使用过,如数据控制公司 6600):对正数“按位取反” ,就表示与其绝对值大小相同、符
号相反的负数,例如, +5 是用 00101 来表示的,那么 -5 就被记作 11010。这种表示法在计
算机工程中被称为反码,见图 2.1。
计算机设计者可以用任意的位组合来表示任意整数。 但是究竟采用哪种表示方法呢?实
际上, 原码和反码在设计加法逻辑电路时, 都会使问题复杂化。 原码和反码在进行加法运算
时都会造成不必要的硬件需求,于是就出现了补码表示法,见图 2.1。补码被运用于现在的
每一台机器之中。
2.3 二进制补码整数
我们在图 2.1 中看到了从 -16 到+15 的二进制补码表示法。 为什么要采用这种表示法呢?
首先,正整数使用直接的位置计数法来表示。对于 5 位而言,我们使用了 2
5
的一半的
码字来表示整数 0 到+15。
对负数表示法的选择是基于尽可能使逻辑电路最简单的想法, 几乎所有的计算机都使用
相同的基本结构来进行加法运算。 它被称之为算术逻辑单元, 也就是我们所知道的取首字母
缩写的 ALU 。我们将在 3、4 章介绍 ALU 的真正结构。现在只需要了解:一个 ALU 有两个
输入和一个输出。 在它进行运算时, 它将要相加的两个二进制位组合作为输入, 求和产生的
一个二进制位组合作为输出。
例如,如果 ALU 能进行 5 位的输入组合的运算,两个输入值为 00110 和 00101,结果
(ALU 的输出)是 01011。加法过程如下:
00110
+ 00101
=01011
两个二进制位组合的加法和两个十进制位组合的加法相同, 从右向左,一列一列的运算。
如果一列的加法有进位,进位立即加至它的左列。
值的一提是二进制 ALU 并不知道(也不关心)所加的两个位组合表示什么。它只是简
单的将二进制数相加。 ALU 只做加法而不考虑其他,这一点将对我们为整数分配码字十分
有利。
首先考虑,如何分配码字 [ 表示一个数(或字符)的若干位二进制代码。 ],使得两
个绝对值相同符号相反的整数在 ALU 做加法的结果为 0。也就是说, 如果对 ALU 的输入是
A 与 -A 的表示,那么, ALU 的输出应是 00000。
为了实现这个目的,补码数据类型定义了每一个负整数的表示,即:当 ALU 把它加上
绝对值大小相同的正数,结果会是 0 的表示法。比如说,既然 00101 是+5 的表示法, 11011
就被选作 -5 的表示法。
此外,还必须考虑的重要一点是,分配码字应使 ALU 在对每个数值加 00001 后,应得
到正确的结果。这样,所有的二进制数值就像十进制的 -15 到+15 一样。
我们可以使用数学语言来表示:
表示( VALUE+1 )=表示( VALUE )+表示( 1)
以上两点,就足以保证 ALU 正确地做加法运算 (只要得到的结果不大于 +15 或小于 -16)。
特别的,注意 -1 和 0 的表示,分别为 11111和 00000。当我们对 -1 的表示加上 00001,
我们就得到 00000,虽然有一个进位,但是该进位不影响结果。也就是说,把 00001 和-1 的
表示相加的正确结果是 0,而不是 100000。因此,进位可以被忽略。实际上,在做补码算术
运算时,这个进位总是被忽略。
一个计算 -A 的表示的简便方法:已知 A 的表示,对 A 按位取反,然后把 A 和 A 的反
码相加;这个结果是 11111。如果再加上 00001,就得到结果为 0。因此, -A 的表示可以简
单地通过把 A 的反码加 1 得到。
例题 2.1 -13 的二进制补码表示是什么?
1.如果 A 是+13,它表示为
01101
2. A 的反码是
10010
3. 加 1 到 10010 得到 10011,-13 的二进制补码表示是 10011
我们可以通过对 A 和-A 的表示作加法,来验证我们的结果:
01101
+ 10011
00000
你可能已经注意到 01101 和 10011 的加法,除了得到 00000,还得到一个进位。也就是
说, 01101 和 10011 的二进制加法实际上得到 100000。然而,正如我们前面看到的,在使用
二进制补码的情况下,这个进位可以被忽略。
至此,使用 5 位,我们能够识别出 15 个正数, 15 个负数,和一个 0。如果 k=5 ,我们
能够识别出 32 个不同的数, 但是我们只说明了 31(15+15+1)个。剩下的一个表示是 10000,
我们应该分配一个什么值给它?
我们注意到 -1 是 11111,-2 是 11110,-3 是 11101,等等。继续下去, -15 是 10001。正
如正数的表示法一样,当我们从 -1 到-15 按顺序后退时, ALU 从每一个表示上减去 00001。
这样,将 -16 分配给 10000 是很便利的,那就是从 10001 减去 00001 得到的数值。
在第 5 章,我们将说明一个被我们亲切的称为 LC-3 (小计算机 3)的计算机。 LC-3 对
16 位的数值进行运算。因此, LC-3 中的二进制补码类型整数是从 -32768 到 32767 的整数。
2.4 二进制 -十进制转换
我们经常需要在二进制补码数据类型和日常生活中使用的十进制表示之间进行转换。
2.4.1 二进制到十进制的转换
我们按如下方法从二进制补码向十进制转换: 为了举例说明, 我们假设使用 8 位的二进
制补码表示,相应的十进制数值从 -128 到 127。
一个 8 位的二进制补码数采取如下格式:
a7 a6 a5 a4 a3 a2 a1 a0
其中的每个 a
i
要么是 0 要么是 1。
1. 检查最前面的 a7。如果是 0,该整数是正数, 我们就可以直接计算其数值。 如果是 1,
该整数是负数,我们必须首先取反加一。 ( 当然,先取反再加一也一样 )
2. 通过简单的计算:
a6*2
6
+a5*2
5
+a4*2
4
+a3*2
3
+a2*2
2
+a1*2
1
+a0*2
0
得到该数值。我们只需将那些系数为 1 的 2 的幂次简单相加,就可以得到该数值。
3. 最后,如果原数值是负数,我们在前面加一个负号前缀即可。
例 2.2 将二进制补码整数 11000111 转换为十进制数值。
1. 既然最前面的一位是 1,则该数值是负数。我们首先必须得到与其绝对值相同的正
剩余16页未读,继续阅读
资源评论
nidezlk
- 粉丝: 1
- 资源: 11万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功