1.1计算机基本原理
本节介绍第一台电子计算机及其存储程序和自动控制原理,重点介绍二进制和计算机组成原理。
计算机是具有存储记忆能力的自动化设备。世界上第一台电子计算机于1946年诞生于宾夕法尼亚大学,英文名叫ENIAC,主要用来计算火炮的轨迹。这台计算机占地170平方米,拥有18800个电子管,每秒可做5000次加法运算或400多次乘法运算,传说ENIAC开机运行时,要消耗一个小镇所有住户几天的用电量。
ENIAC计算机
这台计算机是基于冯·诺依曼提出的存储程序与自动控制原理研制的,所以又称为“冯·诺依曼体系”结构计算机,时至今日我们仍然在用这种结构的计算机。所以,冯·诺依曼又被尊称为“现代计算机之父”。
冯·诺依曼是数学家,也是博弈论的开创者。他提出的计算机原理主要有以下三点:一是计算机的程序和数据用二进制表示;二是程序和数据存储在内存中,计算机可以在程序的控制下自动执行;三是计算机由输入和输出设备、存储器、控制器、运算器等五个部件构成。
冯.诺依曼
第一台计算机产生后,计算机经历电子管时代、晶体管时代、集成电路时代、超大规模集成电路时代等四代发展。每个时代,计算机硬件技术与软件技术得不到很大提升,特别是计算机芯片的发展遵循“摩尔定律”,即:每18个月晶体管数量增加一倍、体积缩小一倍、成本缩减一倍。因此,体积越来越小、存储量越来越大、性能越来越高、价格越来越低成为计算机发展的趋势。事实上,现在我们手中的智能手机就是一台高性能计算机,其计算、存储能力比世界第一电子计算机不知要强多少倍!
电子管 | 电子管 | 集成电路 | 超大规模集成电路 |
计算机作为计算和数据处理的工具,从发明那天起主要用来解决现实中具体的问题。计算机如何求解问题呢?第一步,是把现实的问题转化成为计算机世界的问题,即通过抽象等方法把具体问题符号化、数据化;第二步,用二进制把数据按一定格式存储起来;第三步,设计算法,并编写和执行程序完成对数据的自动化加工和处理;最后,得到要求的结果并输出。所以,可以把计算机看成是一台完成数据输入、处理和输出的能自动执行程序的机器。
计算机在时钟时序的控制之下,由控制器从存储器中获得程序指令,分析并执行指令以控制计算机各部件运行;运算器可从内存储器中获取数据并执行基本的逻辑或算术运算后把结果存储到内存储器中;最后根据需要把运算结果变成人们熟知的形式并在显示器等输出设备显示出来。
引自占德臣老师《大学计算机》
计算机的内部是一个二进制的世界,数据和程序都是以二进制形式保存。让我们回顾一下熟知的十进制数,在一个十进制数中,任何一个“位”只能是0至9等十个数码之一,在做加法计算时,两个位的和超过10后,要向左“进位”,这叫“逢十进一”;在做减法运算时,当被减数小于减数时,要向左“借位”,称为“借一当十”。一个十进制数中相邻两位的地位不同,用“位权”来表示,左边的位权是右边相邻位位权的10倍,个位指的是位权为1的位,十分位指的位权为10的位,百分位指的是位权为100的位,如十进制123三位数的位权分别为100、10、1,因此可以把123展开成以下多项式:
123=
二进制是由德国数学家莱布尼茨在十六世纪发明的,只用“0”和“1”两个位来记数,这与我国易经中的“阴爻”和“阳爻”有异曲同工之妙,由“阴爻”和“阳爻”构成的八卦中每一卦实际对应一个二进制数,据说莱布尼茨参考了易经才发明了二进制。
引自占德臣老师《大学计算机》
二进制数中的每个数位中只能出现“0”和“1”两个数码。在计算时如果超过2则进位,如:“1+1”等于2,逢二进一,因此结果为10;而“10-1”,因0不够减,因此借一当二,计算结果为1。仿照十进制,二进制相邻位的位权是2的倍数。如二进制1011可以按位权展开的多项式为:
1011=
当展开二进制数1011成多项式后,再计算其结果为十进制的11。让我们通过以下实例更直观理解二进制:设有8个灯泡,编号依次为0、1、....、7,灯泡0功率为1瓦、灯泡1功率为2瓦、灯泡2功率为4(22)瓦、...、灯泡7功率为128(27)瓦。灯泡0至灯泡7按从右至左如下排列:
二进制模拟
我们可以用0和1来表示每个灯泡的状态,如果对应灯泡亮,则对应状态为1,否则为0。如果所有灯泡都不亮,对应的状态为00000000,亮度为0W。如果只有灯泡7和灯泡2亮,对应的状态为10000100,对应的亮度为128+4=132W。当让所有灯泡都亮时,对应的状态是什么呢?对了,是11111111,总功率为:
128+64+32+16+8+4+2+1=255W
二进制模拟
二进制发明以后,十八世纪英国一位叫布尔的人发明布尔代数,即用二进制来表示与、或、非、异或、同或等布尔运算,而布尔代数是现代计算机所有运算的基础。“与”是双目运算,可用AND运算符表示,如果A与B分别表示一个二制位,当A和B同时为1时,A AND B的结果为1,其它情况都为0;“或”运算用运算符OR表示,当A或B至少一个为1时,A OR B 的结果为1,A和B都为0时,A OR B的结果才会为0;“非”是把1变成0或把0变成1的运算,用NOT 表示,NOT A为1的前提是A为0,为0的前提是A为假。其它运算可以通过以上这三种运算实现。
二进制的0和1两种状态在电路可以用低电平和高电平实现;同样地,与、或、非三种逻辑运算可以用二极管、三极管等简单电路实现;而加、减、乘、除等算术运算可以用几种简单逻辑运算简单实现,如下图:
F=A AND B | F=A OR B | F= NOT A |
了解和掌握二进制对于学习计算思维和程序设计都非常重要。现在,我们来看看如何在二进制和十进制之间进行互相转换。二进制数转换成十进制数非常简单,只要把二进制按权展开成多项式后,计算结果就可以得到,如:
==
但是,要把十进制转换成二进制要花点时间。观察十进制11的二进制展开多项式,除了最右边一项外(1*),其它项都含有2的因子,因此把多项式除以2取余数,即可得二进制的右边第一位(d0位)1。而多项式除以2后变成了:
用此多项式再除以2取余数即可得到右边第2位(d1位)1。反复使用除以2取余数的方法,可依次得到d2、d3位,分别为0、1。然后把得到余数序列1、1、0、1反序排列,即得到十进制11的对应的二进制数1011。这种方法称为“辗转相除取余法”。如图所示:
如果想把十进制小数变成二进制,采取的是“小数相乘取整法”。设原小数为0.y,把小数乘以2后得到形如x1.y1的数,取x1作为位;再把0.y1乘以2得x2.y2,取x2作为位;再把0.y2乘以2得到x3.y3,取x3作为位,...,按此办法,直至xn.yn中yn为0或达到要求的精度时结束。此时,十进制0.y对应的二进制为
如十进制0.325变成二进制的过程如下:
值得注意的是,0.325用二进制不能精确表示,因为从最后一行1.20开始就出现了无限循环小数“0011”,即0.325=0.01010011。再把0.01010011转换成十进制,结果是:
=0.25+0.0625+0.0078125+0.00390625
=0.32421875
可以发现,因为小数截断第8位,所以所得结果与0.325有较大误差!
本节介绍了计算机的发展和现代计算机的基本原理——存储程序与自动控制原理,重点介绍了计算机运算的基础——二进制,及二进制与十进制之间的转换关系。本节就讲到这里,下一节再见!