《揭开编程的核心奥秘.pdf》由会员分享,可在线阅读,更多相关《揭开编程的核心奥秘.pdf(51页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、编程高手的素养何勤1详细讲解编程思想详细讲解编程思想详细讲解编程思想详细讲解编程思想衔接各门主干课程衔接各门主干课程衔接各门主干课程衔接各门主干课程揭开编程核心奥秘揭开编程核心奥秘揭开编程核心奥秘揭开编程核心奥秘编程高手的素养编程高手的素养编程高手的素养编程高手的素养何勤何勤何勤何勤 著著著著全书约四百多页,每次修订定稿后上传一到两章全书约四百多页,每次修订定稿后上传一到两章全书约四百多页,每次修订定稿后上传一到两章全书约四百多页,每次修订定稿后上传一到两章版权所有,未经作者授权不得私自印刷或转载版权所有,未经作者授权不得私自印刷或转载版权所有,未经作者授权不得私自印刷或转载版权所有,未经作者
2、授权不得私自印刷或转载编程高手的素养何勤2前言前言前言前言目前,任何人要想真正学会编程,几乎要花费五到十年的时间卧薪尝胆、悬梁刺股。真正原因何在?这其实只需到真正会编程的人身上就能找到根本原因。经过认真仔细地分析,我发现:根本原因在于每个真正会编程者,都必须具备计算机科学的大局观.。也就是说,每个真正会编程者都必须懂得:1、C 语言的基本语法;2、计算机是如何工作的;3、操作系统是如何为应用程序运行服务的;4、编译程序大体上是如何进行编译工作的;5、基本常见问题的编程思路和技巧;以上 5 项是必须具备的大局观方面的基本素质。此外,如果想成为程序员,还应当学习和掌握:汇编语言程序设计、算法与数据
3、结构、数据库原理及编程、计算机网络及网络编程、面向对象编程技术等课程知识。由此可见,这条成才之路确实非常谩长!非常艰苦!尤其是掌握第 2 到第 5项知识,更是一个极为痛苦的心路历程上的万里长征!因为读者不仅要认真学习消化这些知识,而且还要做大量的提炼精华、融会贯通的艰巨功课。这是由于各门课之间的内容衔接这项无比艰巨的工作,通常必须由学生亲自去做,目前没有任何一本书在这方面做得比较好。为了极大减少这个学习过程中的痛苦,笔者花费了十年时间广泛收集素材,并且进行了艰苦的探索,终于很幸运的找到了一个绝好的比喻理想厨房系统,恰好可以把以上各方面的知识在一个比较初级的层次上,比较完美地串联起来。为初学者在
4、短时间内把握计算机科学的大局观开辟了一条相对比较轻松的捷径。而且,这也为后续更高级编程技术的学习奠定了良好的知识基础。本书虽然比较系统地讲解了 C 语言语法,但是,读者别指望从这本书中找到高深语法细节问题的讲解。因为笔者认为:过早学习太多语言的高级语法知识,将导致很多学生觉得程序设计课相当枯燥乏味,浪费了读者本可以用来学习生动有趣的编程思路和技巧的宝贵时间和有限精力。然而,本书中的全部例题却是值得你认真钻研的,因为其中蕴含了大量比较经典的编程思想和编程技巧。本书不可能系统讲解各种编程思路(这是算法、数据结构这两门课的任务),然而,本书却教给了读者一种极为有效的举一反三的编程方法,这种方法强调从
5、特殊到一般.来探索问题的编程思路和编程技巧。在循环和数组这两章的很多例题中,展现了如何利用这种方法来做各类编程题。读者要注意,学习钻研本书一定要配套做 100200 道各种类型的由易到难的编程题。这个自己亲自动手编写和调试程序的实践性环节,是任何书籍和老师都无法替代的。读者还要特别注意:千万不要被误导,从而陷入钻研一门高级语言语法细节知识的痴迷和狂热之中。这就象一位想学会写作文的人热衷于冷僻汉字和高深语法,而置更为重要的学习写作思路于不顾那么可笑!必须将编程思路的领会和积累放在编程学习中的首要位置。方向偏离做出再大努力也难以真正学会编程。读者千万不要以为学习和积累编程思想和编程技能只是计算机专
6、业学生的事。任何一位当代社会的理工类大学生,都必须具备一定的编程能力,能够在未来的科技工作中把计算机做为得力助手,否则你就不是当代社会的合格科技人材。编程高手的素养何勤3目录第一章计算机的基本工作原理(初)第二章C 语言的基本概念(基础篇)第三章C 语言的基本概念(提高篇)第四章选择结构程序设计第五章循环结构程序设计第六章数组第七章函数第八章指针第九章字符串与字符数组第十章结构体与链表第十一章C 语言其它内容简介第十二章计算机与操作系统基本工作原理第十三章命令型高级语言编译过程简介附录编程高手的素养何勤4第一章 计算机的基本工作原理(初)学过计算机基础而又想马上学习编程的读者可以直接跳过本章,
7、但最好还是看一下本章末的总结。11 计算机的基本工作原理计算机从发明到现在,不过大约 70 年的时间。然而计算机的发明、改进和普及,却彻底地变革了人类社会。计算机本身也越来越变得复杂、快速、小巧、种类繁多。好在大多数计算机从基本工作原理上来看,都是非常类似的大多数都是冯.诺伊曼型的。这是我们花费少量时间,就能真正理解绝大多数计算机基本工作原理的根本原因。本节是全书的重要基础。通过本节,为你真正揭开计算机究竟如何工作的神秘面纱。(但是要直到 9.4、9.5 节,才能彻底揭开计算机硬件如何在操作系统这个系统软件的调度管理下,并行运行多道程序的内在奥秘。)纠正你对计算机的一些错误认识和看法。并为第
8、2、9、10章的学习打下牢固的知识基础。本节不需要任何的预备知识,只要你能把本节认真仔细地学习两遍,你就能够真正懂得看似极为神秘莫测、奥妙无穷,到目前为止人类有史以来最伟大、最神奇而又最为复杂的发明计算机(又称为电脑。这个伟大发明,汇集了几代人中很多杰出人士的聪明才智和研究成果)是如何工作的基本原理。为达此目的,笔者付出了极大的努力,找到了一种比较好的比喻方法理想厨房系统,由此开始我们的真正理解计算机工作原理的,激动人心的探索旅程。我们将要探索的是:一个看起来很不起眼的,在一些场合被称为“电脑”的电器设备,是如何具有如此神奇的“魔力”和“智能”的奥秘所在。这种神奇的“魔力”和“智能”正在迅速地
9、、彻底地、默默无闻或者令人震惊地改变和丰富我们所生活的大千世界。1 1 1 12.12.12.12.1理想厨房系统:理想厨房系统:理想厨房系统.,.是一个通过顺序执行菜谱中的各个加工步骤,把原材料加工成菜肴的系统。理想厨房系统由硬件(理想厨房、自动冰箱和三条传送带).和软件(菜谱)组成。1)硬件:.理想厨房系统,主要由以下三个硬件.部件(即实物部件)构成理想厨房、自.动冰箱和三条传送带。.自动冰箱:负责临时保存菜谱、原材料和菜肴。是不是很奇怪?菜谱竟然要和原材料一道,统一存放在冰箱中!三条传送带:负责理想厨房与自动冰箱之间的通信及物品(菜谱中的加工步骤、原料和菜肴)传送。理想厨房:负责根据从菜
10、谱中取到的加工步骤进行炒菜以及进行相关的控制工作。2)软件:.理想厨房系统中,还有一个无重量、无体积、不会损坏、可经常更换的,但又极为重要的软件.部件(即信息流部件)菜谱。菜谱由一个个加工步骤顺序组成。注意注意:术语“理想厨房系统”与“理想厨房”是有区别的,理想厨房只是理想厨房系统中的一个组成部分。编程高手的素养何勤5理想厨房系统的构成简图如图 1.1 所示:理想厨房理想厨房自动冰箱自动冰箱碟名 碟中物品格子编号格子中存放加工步骤或原料R0R0R0R0R1R1R1R1厨具厨具R2R2R2R2厨师厨师PCPCPCPC厨房管理员厨房管理员IRIRIRIR材料传送带地址传送带控制传送带0123456
11、7图 1.1 理想厨房系统的构成简图(但图中没给出具体的软件)理想厨房执行菜谱的一个加工步骤,其流程完全是周期性的。厨房管理员首先要根据 PC碟中的值(这个值表示:将要执行的加工步骤,位于冰箱的哪一格中),通过三套传送带的协调工作,到自动冰箱的指定格中去取这个加工步骤。取到理想厨房并把它放到 IR碟中后(PC碟中的值将会加上 1,为取下一个加工步骤做好准备),管理员还要阅读并分析此加工步骤;然后根据此加工步骤的指示,去做以下七类工作中的一种:1通过三套传送带,命令.自动冰箱把指定地址格子中的(炒菜过程马上要用到的)原材料传到理想厨房中来即取物品;2命令.厨师按照指令(即加工步骤)的要求,对原材
12、料(做“炒”,“蒸”,“煮”等基本操作步骤中的一个炒菜动作)作一个基本加工操作即加工原材料。3通过向三套传送带向自动冰箱发命令.,把某个碟子中的成品(或半成品)送回到冰箱指定的格子中存放即存物品;4根据某个状态碟中的具体条件(比如预定时间到了、温度到了),不按正常顺序取出并且执行下一条指令,而是根据此指令中给出的(冰箱格子的相对)地址,跳转到那一格中去取下一条指令即进行跳转。5在厨房的各个碟子或炊具之间传送原料或半成品在厨房内部进行物品传送;6命令传菜生端菜给顾客(在本章不讨论,见第 9 章);7命令配菜员为某菜配原材料(在本章不讨论,见第 9 章);一个加工步骤执行完后,理想厨房立即自动进行
13、下一个完全相同的、新的取加工步骤执行加工步骤的周期。下面我们通过一个实例来讲述理想厨房系统的工作机制。这是本章的重点内容。1 1 1 12 2 2 22 2 2 2 理想厨房系统的一个炒菜实例:理想厨房系统的一个炒菜实例:现在,我们通过编写一道香菇炒菜心的特殊菜谱,把它放在自动冰箱中,并把经过初加编程高手的素养何勤6工的香菇和菜心放在自动冰箱合适的位置,然后启动理想厨房进行炒菜工作。来看看这个似乎很希奇古怪的理想厨房系统,是如何炒好这道“香菇菜心”的。首先,把香菇放在冰箱地址为 5 的格子中,把菜心放在冰箱地址为 6 的格子中,冰箱地址为 7 号的格子,预留给炒好的菜使用。菜谱的所有加工步骤(
14、又称为指令)从冰箱地址 0 号格开始依次按照顺序存放,编写香菇炒菜心的菜谱如下:地址 0 的格子中:取地址 5(中的物品)到 R0 碟;地址 1 的格子中:取地址 6(中的物品)到 R1 碟;地址 2 的格子中:将 R0 碟和 R1 碟倒入炒锅中炒好倒回 R0 碟;地址 3 的格子中:送 R0 碟(中的物品)到地址 7 中;一共有 4 个加工步骤。开始时理想厨房系统状态如下图 1.3(注意:注意:冰箱格子以及理想厨房碟子中存放的物品都用了斜体字)理想厨房理想厨房自动冰箱自动冰箱碟名 碟中物品地址冰箱格子中物品R0R0R0R0R1R1R1R1厨具厨具R2R2R2R2厨师厨师PCPCPCPC0厨房
15、管理员厨房管理员IRIRIRIR材料传送带地址传送带0控制传送带取01234567取地址 5 到 R0 碟取地址 6 到 R1 碟;将 R0 和 R1 炒好倒入 R2 碟;送 R2 碟到地址 7 中;香菇菜心图 1.3一首先,厨房管理员根据 PC 碟子中的数字“0”,知道要到冰箱地址为 0 的格子中取第一条指令(即加工步骤)。于是,厨房管理员向控制传送带上送出一个“取”信号,然后马上将 PC 碟中的数字“0”复制后放到地址传送带上。这两个信号都会到达自动冰箱。自动冰箱收到这两个信号后,将 0 号格的内容复印件“取地址 5 到 R0 碟”放到材料传送带上,送往理想厨房。理想厨房收到后,将这条指令
16、放到 IR 碟中。然后,厨房管理员将.PC.碟中的.原来值增加.1.,.以便为取下一条指令做好准备.。.取指令周期完成后,理想厨房系统处于如下图 1.4 状态:理想厨房理想厨房自动冰箱自动冰箱碟名 碟中物品地址冰箱格子中物品编程高手的素养何勤7R0R0R0R0R1R1R1R1厨具厨具R2R2R2R2厨师厨师PCPCPCPC1厨房管理员厨房管理员IRIRIRIR取地址 5 到 R0 碟材料传送带地址传送带控制传送带01234567取地址 5 到 R0 碟取地址 6 到 R1 碟;将 R0 和 R1 炒好倒入 R2 碟;送 R2 碟到地址 7 中;香菇菜心图 1.4厨房管理员读到指令存放碟(即 I
17、R碟)中的加工步骤后,知道要到冰箱地址号为 5 的格子中去取原材料,并且取来后要放到 R0 碟中。因此,管理员向控制传送带上送出一个“取”信号,然后马上将 5 这个数放到地址传送带上。冰箱收到“取”信号后,知道理想厨房要取物品。然后,冰箱从地址传送带得到了 5,于是冰箱将地址为 5 的格子中的物品“香菇”取出来,放到材料传送带上。材料传送带上的物品“香菇”,传到理想厨房后,按照指令的要求(通过厨房内部的传送带)送到了 R0 碟中。第一条指令执行完后,理想厨房系统处于如下图 1.5 所示的状态:理想厨房理想厨房自动冰箱自动冰箱碟名 碟中物品地址冰箱格子中物品R0R0R0R0香菇R1R1R1R1厨
18、具厨具R2R2R2R2厨师厨师PCPCPCPC1厨房管理员厨房管理员IRIRIRIR取地址 5 到 R0 碟材料传送带地址传送带5控制传送带取01234567取地址 5 到 R0 碟取地址 6 到 R1 碟;将 R0 和 R1 炒好倒入 R2 碟;送 R2 碟到地址 7 中;香菇菜心图 1.5二下面开始执行下一条指令的取指周期,类似于前一条指令,在取指周期完成后,理想厨房系统处于如下图 1.6 状态:理想厨房理想厨房自动冰箱自动冰箱碟名 碟中物品地址冰箱格子中物品R0R0R0R0香菇R1R1R1R1厨具厨具R2R2R2R2厨师厨师PCPCPCPC2厨房管理员厨房管理员IRIRIRIR取地址 6
19、 到 R1 碟;材料传送带地址传送带1控制传送带取01234567取地址 5 到 R0 碟取地址 6 到 R1 碟;将 R0 和 R1 炒好倒入 R2 碟;送 R2 碟到地址 7 中;香菇菜心图 1.6编程高手的素养何勤8管理员分析指令存放碟中的加工步骤(指令)后,知道要到冰箱地址为 6 的格子中去取原材料,并且放到 R1 碟中。因此,管理员向控制传送带上发一个“取”信号,然后马上将6 这个数放到地址传送带上。冰箱收到“取”信号后,知道理想厨房要取东西,然后,冰箱从地址传送带得到了 6,于是冰箱将地址为 6 的格子中的物品“菜心”取出,放到材料传送带上。材料传送带上的物品“菜心”,传到理想厨房
20、后,按照指令的要求通过厨房内部的传送带被自动送到 R1 碟中。第二条指令执行完后理想厨房系统处于如下图 1.7 状态:理想厨房理想厨房自动冰箱自动冰箱碟名 碟中物品地址冰箱格子中物品R0R0R0R0香菇R1R1R1R1菜心厨具厨具R2R2R2R2厨师厨师PCPCPCPC2厨房管理员厨房管理员IRIRIRIR取地址 6 到 R1 碟;材料传送带地址传送带6控制传送带取01234567取地址 5 到 R0 碟取地址 6 到 R1 碟;将 R0 和 R1 炒好倒入 R2 碟;送 R2 碟到地址 7 中;香菇菜心图 1.7三下面开始执行下一条指令的取指周期,类似于前一条指令,在取指周期完成后,理想厨房
21、系统处于如下图 1.8 状态:理想厨房理想厨房自动冰箱自动冰箱碟名 碟中物品地址冰箱格子中物品R0R0R0R0香菇R1R1R1R1菜心厨具厨具R2R2R2R2厨师厨师PCPCPCPC3厨房管理员厨房管理员IRIRIRIR将 R0 和 R1 炒好倒入 R2 碟;材料传送带地址传送带2控制传送带01234567取地址 5 到 R0 碟取地址 6 到 R1 碟;将 R0 和 R1 炒好倒入 R2 碟;送 R2 碟到地址 7 中;香菇菜心图 1.8厨房管理员看到 IR碟中的内容后,命令厨师将 R0 碟和 R1 碟中的原材料倒入锅中炒好后,倒入 R2 碟中。完成后如图 1.9理想厨房理想厨房自动冰箱自动
22、冰箱碟名 碟中物品地址冰箱格子中物品编程高手的素养何勤9R0R0R0R0香菇R1R1R1R1菜心厨具厨具R2R2R2R2香菇菜心厨师厨师PCPCPCPC3厨房管理员厨房管理员IRIRIRIR将 R0 和 R1 炒好倒入 R2 碟;材料传送带地址传送带控制传送带01234567取地址 5 到 R0 碟取地址 6 到 R1 碟;将 R0 和 R1 炒好倒入 R2 碟;送 R2 碟到地址 7 中;香菇菜心图 1.9四下面开始执行下一条指令的取指周期,类似于前一条指令的取指令阶段,在取指令周期完成后,理想厨房系统,处于如下图 1.10 状态:理想厨房理想厨房自动冰箱自动冰箱碟名 碟中物品地址冰箱格子中
23、物品R0R0R0R0香菇R1R1R1R1菜心厨具厨具R2R2R2R2香菇菜心厨师厨师PCPCPCPC4厨房管理员厨房管理员IRIRIRIR送 R2 碟到地址 7 中;材料传送带地址传送带控制传送带01234567取地址 5 到 R0 碟取地址 6 到 R1 碟;将 R0 和 R1 炒好倒入 R2 碟;送 R2 碟到地址 7 中;香菇菜心图 1.10下面开始执行“送 R2 碟到地址 7 中”这条指令。厨房管理员分析指令存放碟中的加工步骤后,知道要将 R2 碟中的物品,送到冰箱地址为 7 的格子中去存放。于是,管理员向控制传送带上发一个“存”信号,然后马上将 7 这个数放到地址传送带上,最后将 R
24、2 碟中的物品“香菇菜心”放到材料传送带上,送往冰箱。冰箱收到“存”信号后,知道理想厨房要存放物品,然后,冰箱从地址传送带得到了 7,于是自动冰箱(的机械手)在材料传送带旁,等待从理想厨房 R2 碟传来物品“香菇菜心”,一旦到达,自动冰箱就将其取下,并将其存放到地址号为 7 的格子中。完成后系统状态如图 1.11:理想厨房理想厨房自动冰箱自动冰箱碟名 碟中物品地址冰箱格子中物品编程高手的素养何勤10R0R0R0R0香菇R1R1R1R1菜心厨具厨具R2R2R2R2香菇菜心厨师厨师PCPCPCPC4厨房管理员厨房管理员IRIRIRIR送 R2 碟到地址 7 中;材料传送带地址传送带控制传送带012
25、34567取地址 5 中到 R0 碟取地址 6 中到 R1 碟;将 R0 和 R1 炒好倒入 R2 碟;送 R2 碟到地址 7 中;香菇菜心香菇菜心图 1.11香菇菜心,终于大功告成了。1.23理想厨房系统与计算机系统术语对照表理想厨房的工作原理,与计算机的工作原理是极为类似的。下面首先给出两个系统之间的术语对照表,见表 1.1。表 1.1术语对照表理想厨房系统理想厨房系统理想厨房系统理想厨房系统电子数字计算机(简称计算机)电子数字计算机(简称计算机)电子数字计算机(简称计算机)电子数字计算机(简称计算机)1.硬件设备自动冰箱(包含多个大小相等的格子)内存(又称为主存,包含很多大小相等的基本存
26、储单元)一个格子一个基本存储单元材料传送带数据总线地址传送带地址总线控制信号传送带控制总线理想厨房(包含以下设备)CPU(或称微处理器,包含以下部件)厨师及炒菜设备算术逻辑单元 ALU(又称为运算器)厨房管理员控制单元(又称为控制器)通用临时存放碟通用寄存器指令地址存放碟 PC指令地址寄存器(又称为程序计数器 PC)指令存放碟 IR指令寄存器(又称为 IR 寄存器)状态存放碟状态寄存器专用加工容器专用寄存器采购员及配菜员输入设备(键盘、鼠标、网卡、U 盘等)传菜生输出设备(显示器、打印机、网卡、U 盘等)自动仓库外存(硬盘、U 盘,同时也属于输入输出设备)编程高手的素养何勤112.软硬件之间的
27、接口(编写菜谱或程序的基本要素)冰箱格子的地址(即编号)内存中基本存储单元的地址(即编号)厨师可做的各种炒菜的基本动作(蒸、炒、炸、煮等)运算器可进行的各种基本运算(算术运算、逻辑运算等)碟子的名称寄存器的编码或代号理想厨房可以执行的所有各种加工动作(指令)该类型计算机的指令集3.软件特殊菜谱(机器语言形式的)程序加工步骤(机器)指令原材料数据炒好的菜信息(或称为结果)精确的普通菜谱高级语言程序(又称为源程序或源代码)简要的普通菜谱伪代码4.系统的使用者编写特殊菜谱者用机器语言编程的程序员编写精确的普通菜谱者用高级程序设计语言编程的程序员理想厨房系统的大堂经理和顾客计算机的用户这么多的关于计算
28、机系统的专业术语,只要通过在计算机系统上运行一个简短的程序,就可以把这些术语中的绝大多数都关联起来(参见 1.6 节)。如果没有对理想厨房工作原理的详细讲解,由于出现了太多新的专业术语和名词,人们决对很难在短时间内,全面把握和理解这个计算机系统的工作原理的(对于任何一个初学者,这都是一件极其困难的事)。点评:当在一个你不熟悉的领域中进行学习并遇到比较大的理解上的困难时,主动寻找一些你所熟悉的日常生活中的相类似的模型来帮助理解是极为重要的,即使这个理想模型在日常生活中有可能不存在。1 1 1 12 2 2 24 4 4 4 计算机与计算机系统:计算机与计算机系统:计算机(系统)是一个通过顺序执行
29、程序中的指令,把数据加工成信息的系统。计算机计算机由硬件(中央处理单元、内存和三套总线)和软件(程序)组成。这是一个由数字逻辑电路构成的,以极快速度(接近光速)运行程序的,纯二进制的电子“世界”。计算机系统计算机系统由硬件(中央处理单元、内存和三套总线)、软件(程序)和外围设备(输入输出设备和硬盘等外存)组成。编程高手的素养何勤121 1 1 12 2 2 25 5 5 5 计算机的硬件计算机的硬件!)计算机硬件主要由以下三个部件构成:中央处理单元(.CPU.).、内存、三套总线。.内存(相当于自动冰箱):由极大量的大小相同的基本存储单元()组成(通常的个人计算机通常有几千万到上亿个这样的基本
30、存储单元)。每个基本存储单元,具有一个唯一的顺序编号(即内存地址)。通常的现代计算机内存中的一个基本存储单元,可以存放一个字节(即 8 位)的二进制位串。内存负责临时保存正在执行(和将要执行)的程序、数据和信息。这些内容在内存中,全部都是以二进制形式存放的。三套总线(相当于三条传送带):负责中央处理单元(CPU)与内存之间的通信及数据(包括程序中的指令、数据和信息)传送。中央处理单元(相当于理想厨房):负责到内存中取(程序的)指令,并根据指令对数据进行运算处理以及进行相关的控制工作。中央处理单元中的主要部件有:控制器(相当于厨房管理员)、运算器(相当于厨师加炊具)和一些寄存器(相当于厨房中的碟
31、子)。1 1 1 12 2 2 26 6 6 6 计算机的软件计算机的软件构成计算机的部件中,还有一个无重量的、无体积的、不会损坏、可经常更换的,极为重要的软件部件(即命令计算机如何工作的信息流)程序。程序是由一条条指令顺序组成的(可存放在内存和外存中)。计算机的构成简图如图 1.2 所示:中央处理单元(中央处理单元(CPUCPUCPUCPU)内存内存寄存器名 寄存器中物品地址存储单元中存放程序或数据R0R0R0R0R1R1R1R1R2R2R2R2运算器运算器PCPCPCPC控制器控制器IRIRIRIR数据总线地址总线控制总线000001010011100101110111图 1.2 计算机系
32、统的构成简图 中央处理单元(中央处理单元(CPUCPUCPUCPU)执行指令的过程,完全是周期性的)执行指令的过程,完全是周期性的控制器首先要根据 PC 寄存器中的值(这个值表示:将要执行的指令,位于内存的哪一个内存存储单元中),通过三套总线,到内存中去取这条指令。取到中央处理单元并把它放到指令寄存器之后(PC 寄存器中的原来值,将会加上刚取到的这条指令的字节数,以便为编程高手的素养何勤13取下一条指令做准备),控制器还要对该指令进行译码。然后根据此指令的指示,通过控制总线通知计算机的各部件,去做以下七类工作中的一种:1通过三套总线,命令内存,把指定地址存储单元中的(炒菜过程马上要用到的)数据
33、,送到中央处理单元中(的某个寄存器)来即取数据;2命令运算器按照指令的要求,对数据(做“炒”,“蒸”,“煮”等基本操作步骤中的一个炒菜动作)作一次基本运算即数据处理。3通过向三套总线向内存发命令,把某个寄存器中的运算结果(或中间运算结果)送回到内存中(由内存地址)指定的存储单元中存放即保存结果;4根据某个状态寄存器中的某个具体值(比如上一条指令的运算结果为零),不按正常顺序取出并且执行下一条指令,而是根据此指令中给出的(内存的)地址,跳转到那一存储单元中,去取下一条指令即进行跳转。5在中央处理单元的各个寄存器之间传送数据在中央处理单元内部进行数据传送(移动);6命令输出设备输出一个数据(在本章
34、不讨论,见第 9 章);7命令输入设备输入一个数据(在本章不讨论,见第 9 章);一条指令运行完后,中央处理单元立即自动进行下一个形式完全相同的、新的取指令执行指令的周期。反复、自动进行的取指令取指令.执行指令周期执行指令周期.,是计算机进行各种数据处理工作中的核心操作(就象反复、自动进行的心脏搏动周期,是人体进行各种活动的核心运动)。注意:我们暂不考虑如何从外部输入.程序和数据到计算机系统的内存中,也暂不考虑如何从计算机系统的的内存中输出.信息到系统外部的问题。这些重要而又比较复杂的问题,请参见第 9 章。1.2.71.2.71.2.71.2.7 二进制及相关知识简介:二进制及相关知识简介:
35、虽然理论上可以使用任何进制(比如十进制)为基础来制造计算机,但现代计算机全部都是采用二进制的电子数字信号进行工作的机器。也就是说,在计算机的内部,实际上都只能以二进制的数或码的形式来存放、传输、运行程序的指令和任何需要加工的数据的。为了从底层真正理解计算机的工作原理,读者必须对二进制有所了解。以下简要介绍相关知识。1.5.2.1 二进制数的概念二进制数的概念首先,来看一张部分十进制数与二进制数的数值对照表:十进制数所对应的二进制数001121031141005101编程高手的素养何勤14611071118100091001101010111011121100131101141110151111
36、表 1.2部分十进制数与二进制数的数值对照表部分十进制数与二进制数的数值对照表部分十进制数与二进制数的数值对照表部分十进制数与二进制数的数值对照表一般情况下,用 n 位二进制,可表示的最大正整数值是 2n-1。比如 4 位二进制可表示的最大正整数是 24-1=15(即 1111)2。可见,二进制只能用两个数字“0”和“1”来进行计数(或表示各种不同状态)。二进制加法运算的重要规则是:1+1=10,即两个 1 相加产生向高位的进位。左边是高位数,右边是低位数(此外,加法规则还有:1+0=1、0+1=0、0+0=0)。我们用一对圆括号括住一个数值,并在圆括号外面加一个数字下标,来表示一个数是几进制
37、数:比如(1011)10是一个十进制数;而(1011)2是一个二进制数。将二进制整数转化成十进制整数将二进制整数转化成十进制整数一个十进制的数,其数值可用以下展开式来表示:比如 3785(3785)10=3103+7102+8101+5100(1)我们把(1)式中 10 的几次方称为权重.,权重左边的乘数称为系数.。(1)式中共有 4个系数,从左到右依次是:“3”“7”“8”“5”。可见,在数值数据中,越左边的数字(系数)权重越大。类似的,一个二进制数,其数值也可用以下展开式来表示:比如二进制数 1011(1011)2=123+022+121+120(2)此二进制数的值,等于十进制的 18+0
38、4+12+11=8+2+1=(11)10(3)由此可以得到:二进制整数转化成十进制整数的一般方法二进制整数转化成十进制整数的一般方法:只要将该二进制整数(即 1011)展开后的(2)式中的每一位的系数值,乘以这一位的转化成十进制数后的权重.(即 2 的几次方),然后再将逐个乘积项的数值相加起来即可。练习 1:将二进制数11010010 转换成十进制。将十进制整数转化成二进制数:将十进制整数转化成二进制数:编程高手的素养何勤15现在再来考查十进制数 11,从上一小节的(2)式我们知道:(11)10=123+022+121+120(4)将这个等式两边都整除 2,等式将变为(5),余数为余数为.1
39、1 1 1.。这个 1 就是转化成 2 进制数后的最低位(即最右边位)的值(注意,此数正好是等式(4)的最低位中的系数)。5=122+021+1 20(5)继续再将(5)这个等式两边都整除 2,等式变为(6),余数为余数为.1 1.,这个 1 就是十进制数 11 转化成 2 进制数后的次低位的值(注意,此数正好是等式(5)的最低位中的系数)。2=121+0 20(6)继续再将(6)这个等式两边都整除 2,等式变为(7),余数为余数为.0 0.,这个 0 就是十进制数 11 转化成 2 进制数后的从右边数第 3 低位的值(注意,此数正好是等式(6)的最低位的系数)。1=120(7)继续再将(7)
40、这个等式两边都整除以 2,等式变为(8),余数为余数为.1 1.,这个 1 就是十进制数 11 转化成 2 进制数后的从右边数第 4 位的值(注意,此数正好是等式(7)的最低位的系数)。0=0(5)至此,十进制数 11 转换成二进制数的过程已经结束,答案是等于二进制的 1011。实际上,将十进制数 11,转换成二进制数 1011 之前,我们是不会得到等式(4)右边式子的。写出这些式子是为了揭示出数制转换过程中的奥秘。我们在实际的十进制数转换成二进制数过程中,只要不停地用 2 除,不断地将得到的余数(不是 1 就是 0)由低位到高位(就是说,按从右到左的顺序)逐个书写出来即可。直到此十进数的商最
41、终成为 0 时,转换过程才告结束。由以上讨论。可以得到:将十进制整数转化成二进制数的一般方法将十进制整数转化成二进制数的一般方法短除法短除法:上述这种 102 进制数的转换方法,被变形为一种更为直接的短除法:1.将十进制数转换成二进制数的短除法:短除法把要转换的数字不断的除以 2 然后取余数,商为 0 的时候结束。然后把余数.倒着写出来。例如:把 84 转换成二进制数0 0 0 024222121025222120840 0 0 01 1 1 10 0 0 01 1 1 10 0 0 01 1 1 1编程高手的素养何勤16即:(84)10=(1010100)2注意.:.短除法实际上适用于将一个
42、十进制整数转换为一个任意.n(.n2.).进制的整数.,.只需将除.数.2.变为.n.即可.(参见第.讲.).。.练习 1:查阅参考书(比如任何一本计算机导论或大学计算机基础),看看十进制的纯小数是如何转化为二进制的纯小数的。1.2.8 数和码的区别:数和码的区别:十进制的数和码:十进制数 3785 和十进制码 3785 的区别:如果 3785 用于表示数,则越高位(即越左边的位)的数字越重要(因为权重越大,在十进制数 3785 中,“3”的权重是 103,而“5”的权重是 100)。而 3785 用于表示非数值的码,则每一位都同样重要。对于数来说,3785 与 3786 的取值差不多大(你可
43、以说 3785 约等于三千七百,但你决对不可以说,3785 约等于八十五)。但如果 3785 和 3786 是用来作为汉字编码的话,那就可以表示两个意义完全不同的汉字。例如:3785 可以表示“我”字,而 3786 则可以表示“你”字。所以,当我们看到由多个十进制数字构成的一个数字串.时,如果我们不知道它的含义到底是数还是码。在这种情况下,我们把它称为一个“数字串.”。例如十进制的数字串 3785由四位十进制数字“3”、“7”、“8”、“5”组成。它既可以表示一个十进制的数值三千七百八十五,也可以表示码为 3785 的一个汉字(或者表示别的什么 10000 个同类事物或状态中的,编码为 378
44、5 的一个特定事物或状态)。二进制的数和码:与十进制一样,二进制数和二进制码也有类似的区别。只不过在二进制中只能用 0 和 1组成的一个二进制“位串”来构成任何大小的数值或者表示具有任何含义的码。换句话说,某个特定的 8 位二进制位串,例如:(01100001)2既可以表示一个无符号的二进制数值其数值等于(97)10;也可以表示某种编码方式下的一个码。因为编码方式是无限的,所以二进制码(01100001)2所表示的含义可以是无限的(既可以代表某个具有 256 种不同颜色的调色板中的第 97 种颜色;也可以表示 256 个工种中的第 97 号工种等等)。除非已经指明了是采用何种编码方式。深入一步
45、:数和码之间的复杂关系数和码之间的复杂关系数和码之间的复杂关系数和码之间的复杂关系当然,对数值数据本身也还是可进行编码的。比如对于一个二进制的有符号整数,由于在计算机中,也只能用二进制的一个位来表示此数的正负号,因此也有多种编码方式。常用的有原码、反码、补码这三种编码方式,来表示有符号的二进制整数。其中补码被当今大多数计算机采用(参见第 3 章)。与表示非数值的事物(或状态)的编码不一样,对于数值数据的编码(比如补码),位串中的每一个“位”的重要性(与权重相关)是不一样的。再比如,对一批数值数据进行压缩和解压,其实通常也是一种多对少的编码和少对多的编程高手的素养何勤17解码。如果用一个二进制的
46、位串,来书写计算机的一条机器指令。则该位串中是既有码,又有数:位串的左边部分一般是指令的操作码.,位串的右边部分是操作数.(参见下面的讨论)。虽然“码”本身也是一个“值”(序数值),但对于非数值编码的码值进行数学运算,通常是毫无意义的(除非你想对这些码进行加密或对密码进行解密)。非数值编码的码值的通常意义,仅仅是某张编码表中的一个序号.而已。通过这个序号,可以在该编码表中,查到此码所代表的真正含义(这个真正的含义,不经过编码无法进入二进制的计算机内部世界)。然而,对于数值编码的码值,是可以进行数学运算的(比如 CPU 中的运算器用补码做算术运算,而软件则通过规定的运算在补码和十进制整数值之间进
47、行转换)。1.2.91.2.9二进制的二进制的 ASCIIASCII 码:码:在计算机中,用来表示非数值的文字型数据的,最为常见的 7 位二进制位串的编码是ASCII 码(美国国家信息交换用标准码)。标准的 7 位 ASCII 码可以表示 128(即 27个)个字符,参见附录 B。在计算机中可以用 ASCII 码的序列,来表示英文文章(所有英文文章中出现的字符,一般都包含在 ASCII 码表内);也可以将人们用高级程序设计语言或汇编语言编写出来的程序,转换成二进制的 ASCII 码的形式输入到计算机的内存中(参见第节)。每个 ASCII 码存放在一个字节大小的基本存储单元中(字节的最高位一般填
48、一个 0,只用低7 位)。ASCII 码已经作为国际标准,是用计算机处理非数值的文字型数据的最重要的基础。例如:小写英文字母 a 的 ASCII 码为(97)10。为了在计算机中存放键盘上敲击的字符 a,其实(计算机的硬件和软件配合起来)最终只是在内存中存放了与之相对应的二进制 的ACSII 码的值:(01100001)2因为它等于(97)10。练习 1:上网查找有关 Unicode码的一些更详细的知识练习 2:上网查找其他资料,了解计算机如何表示和存储汉字、声音和图像。1.2.101.2.10基本存储单元的概念:基本存储单元的概念:位位:存储或传输一个二进制位,称为一个位.(Bit)。如果用
49、来表示数,一个位构成的位串,只能表示两个整数值“0”或“1”中的某一个。如果单个位构成的位串来表示码,则只能用来对两种不同的事物(或状态)进行编码。比如:用 1 表示“真”,用 0 表示“假”;或者用 1 表示“大”,用 0 表示“小”;等等。字节:字节:一个 8 位的二进制的位串,就构成了一个字节.(Byte)。一个字节的位串,如果用来表示无符号的整数,则只能表示 256 个整数值。分别是从 0到 255,对应于二进制的无符号数(00000000)2到(11111111)2。一个字节的位串,如果用来表示一种非数值的编码,则只能用来对 256 种同类事物(或状态)中的单个事物(或状态)逐一进行
50、编码(即映射)。但是,“字节”这个术语其实有两种含义:一种是用来度量内存(或外存)数据存储容量的大小(内外存的数据存储容量的大小,不是以体积来度量的。因为信息或数据本身是无编程高手的素养何勤18体积的);另一种是用来度量数据(或信息)传输过程中的数据量(或信息量)的多少。字字:两个、4 个或 8 个字节组合在一起,就构成了一个字(Word)。究竟是由几个字节构成一个字,取决于该类型计算机的数据总线的宽度(即构成数据总线的并排导线的根数)是多少(因为在计算机中,往往通过总线在内存和其他部件之间,一次传送一个字的二进制位串)。基本存储单元:所谓基本存储单元(Cell),就是具有一个.可以用来定位其