程序员视角的计算机系统 第一部分 程序的结构与执行

程序员视角的计算机系统  第一部分 程序的结构与执行

我们的计算机系统的探索开始于学习计算机本身,从一个处理器和一个内存子系统开始。
在核心, 我们要求表示基本的数据类型的方式,例如对整数和实数算法的估计。从这
我们能够考虑机器级别的指令如何操纵数据和一个编译器是如何翻译C语言的程序到这些
指令的。接下来,为了得到硬件资源是如何使用来执行指令的更好的理解,我们研究了
实现一个处理器的几种方法。一旦我们理解了编译器和机器级别的代码,我们能够检查通过
写C程序来如何最大化程序的性能,当编译之后,达到最大的可能的性能。我们总结了内存
子系统的设计,它是一个现代的计算机系统中最复杂的组件之一。

本书的这一部分,将给你应用程序是如何被表示和执行的一个深入的理解。你将得到如下的
技能,这技能能帮助你写好程序,让程序是安全的,可靠的,最好地利用计算机资源。

第2章 信息的表示与操纵

现代的计算机存储和处理表示为2值信号的信息。这些二进制的数字,或者是比特,形成了
数字革命的基础。十进制的表示已经使用了超过一千年,这是印度开发的,在十二世纪被
阿拉伯的数学家改进,在十三世纪,由意大利的数学家利奥那多-披萨诺带到了西方,更知名
的是斐多那契。对于有十个手指的人类来说,使用十进制的标记法是自然的,但是当构建机器存储
与处理信息时,二进制的值工作得更好。二值的信号能够被很好地表示,存储,传输,例如,在
一个纸片卡上的孔的有与无,在一个电线上电压的高与低,或者是磁域是基于顺时针还是逆时针方向。
对于在2值信号上,存储与执行计算,电子电路是简单的,可靠的,让制造商能够集成百万个,甚至是
数十亿个晶体管在一个硅芯片上。

在单独的方面,一个单独的比特位不是很有用。当我们把比特位组合在一起时,应用一些解释,把
给定的意义分给不同的可能 的比特模式,然而,我们能够表示任何有限的集合的元素。例如,
使用一个二进制 的数的系统,我们能使用比特的组合,来编码非负的数字。通过使用一个标准的字符码,
我们能编码一个文档中的字符和符号。在这一章中,我们覆盖了这些编码,正如我们编码表示了负数
和合适大小的实数。

我们认为有三种最重要的数字表示。无符号的编码是基于传统的二进制标记法,表示大于等于0的数字。
二的补码编码是表示有符号的整数的最常用的方法,也就是数字可能是正的,也可能是负的。浮点数
的编码是为了表示实数的科学记数法的二进制的版本。计算机实现了算术操作,例如加法和乘法,具有
不同的表示方法,对应到整数与实数上的操作都是相似的。

计算机表示为了编码一个数字,使用一个有限的比特位数,因此,被表示的结果太大时,一些操作
能够溢出。这能够导致一些令人吃惊的结果。例如,在现在的计算机上的情况(使用32比特表示整数
的数据类型)计算如下的表达式
200*300*400*500
返回-884,901,888。 这违反了整数的算术性质,计算一些正数的乘积却返回了负的结果。

另一个方面,整数的计算机算术满足了很多的真正的整数算术的相似的性质。例如,乘法有结合律,
和交换律,所以计算如下的C表达式都返回了-884,901,888:
(500*400)*(300*200)
((500*400)*300)*200
((200*500)*300)*400
400*(200*(300*500))
计算机没有生成预期的结果,但至少它是有一致性的。

浮点数的算术有不同的数学性质。一些正数的乘积将总是正的,尽管溢出时返回的是正无穷大。
浮点数的算术是没有结合律的,原因是表示的有限的精度。例如,C表达式(3.14+1e20)-1e20
将在绝大部分的机器上计算为0,而3.14+(1e20-1e20)将计算为3.14 。整数与浮点数的算术
的不同的数学性质源于它们处理表示的有限性的不同,整数表示了一个相当小的值的范围,
但是是精确地表示,浮点数表示能够编码值的很大的范围,但仅是近似而矣。

通过研究实际 的数字的表示,我们能够理解被表示的值的范围和不同的算术操作的性质。
这种理解是对于写程序是很关键的,让程序在整 体数的范围内工作正确并且在不同的机器
,操作系统,编译器的组合上可以移植。正如我们所描述的,计算机安全漏洞的数量的增长
有一部分是由于计算机算术的细微之处。当程序漏洞被触发时,在早期的程序的逻辑错误中,
仅是麻烦了人们,现在有大量的黑客试图探测到程序的逻辑错误,他们能够发现入侵他人的
电脑的机会。对于程序员来说,理解他们的程序如何工作,程序如何能够以非预期的方式
被使用,就是更高层次上的义务了。

计算机使用几种不同的二进制的表示来编码数字 的值。你将需要熟悉这些表示方法,在第3章中
你学习机器级别的语言编程时是需要这些知识的。在这一章中,我们描述了这些编码,向你显示了
这些数字编码的使用的原因。

我们通过直接操纵比特级别的数字表示,我们展示执行数字操作的几种方式。理解这些技术,
对于理解编译器生成机器级别的代码是很重要的,编译器试图优化算术表达式的计算的性能。

这部分的内容基于数学原则的一个核心的集合。我们开始于编码的基本定义,然后描述这些性质,
包括可表示 的数的范围,它们的比特位级别的表示,算术操作的性质。我们认为对于你而言,
从这个抽象的视角审视这个内容是很重要的,因为程序员需要对计算机算术如何与更相似的
整数和实数的算术相关联,有一个清晰的理解。

C++的编程语言根植于C语言,使用了完全相同的数值表示和操作。在这一章中说的关于C的每一件事
也适用于C++.另一个方面,JAVA语言的定义创建了一个对于数值表示和操作的标准的新集合。然而
C标准被设计为允许实现很大的范围,Java的标准是在数据的格式与编码上是很特别的。在这一章中
我们在一些地方将高亮标识被java支持的表示和操作。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值