读程序是怎样跑起来的第二章

IC,是集成电路的简称,有模拟IC和数字IC两种。IC的所有引脚,只有直流电压0V和5V两个状态。也就是说IC的一个引脚,只能表示两个状态。
程序中,即使是十进制和文字等记述信息,在编译后也会转换成二进制数的值,所以,程序运行时计算机内部处理的也是用二进制数表示的信息。对于用二进制数表示的信息,计算机不会区分它的数值,文字还是某种图片的模式等,而是根据编写程序的各位对计算机发出的指示来进行信息的处理或运算。


20世纪50年代,波兰数学家Jan Lukasiewicz,当时也和我们现在的同学们一样,困惑于如何才可以搞定计算机的四则运算,不知道他是否也像牛顿被苹果砸到头而想到万有引力的原理,或者还是阿基米德在浴缸中洗澡时想到判断皇冠是否纯金的办法,总之他也是灵感突现,想到一种不需要括号的后缀表达法,我们也把它称为逆波兰(Reverse Polish Notation,RPN)表示。这种后缀表示法,是表达式的一种新的显示方式,非常巧妙地解决了程序实现四则运算的难题。
我们先来看看,对于"9+(3-1)*3+10/2"(我们平时所用的标准四则运算的表达式也称为中辍表达式
),如果要用后缀表示法应该是什么样子:9 3 1 - 3 * + 10 2 / +,这样的表达式称为后缀表达式,叫后缀表达式原因是在于所用的符号都是在要运算数字的后面出现。显然,这里没有了括号。
后缀表达式:9 3 1 - 3 * + 10 2 / +
规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。
1.初始化一个空栈。此栈用来对要运算的数字进出使用。
2.后缀表达式中前三个都是数字,所以9、3、1进栈。
3.接下来是“-”,所以将栈中的1出栈作为减数,3出栈作为被减数,并运算3-1得到2,再将2进栈。
4.接着是数字3进栈。
5.后面是“*”,也是意味着栈中3和2出栈,2与3相乘,得到6,并将6进栈。
6.下面是“+”,所以栈中6和9出栈,9与6相加,得到15,将15进栈。
7.接着是10与2两数字进栈。
8.接下来是符号“/”,因此,栈顶的2与10出栈,10与2相乘,得到5,将5进栈。
9.最后一个是符号“+”,所以15与5出栈并相加,得到20,将20进栈。
10.结果是20出栈,栈变为空。


计算机中的所有数据,数字字符,控制信号,地址等,都是采用二进制的方式编码,二进制是逢二进位的进位制,0、1是基本算符。一个bit(位)就是一个二进制位(0或1),Byte(字节)是内存的基本存储单位。一个字节有八位二进制组成。存储器的每个存储单元都有一个地址;地址是标识字节在内存中位置的唯一编号。移位运算也可以通过数位移动来代替乘法运算和除法运算。

原文地址:https://www.cnblogs.com/gltks/p/10586652.html

时间: 2024-08-29 11:27:50

读程序是怎样跑起来的第二章的相关文章

《程序员的自我修养》 第二章——编译和链接

摘自http://blog.chinaunix.net/uid-26548237-id-3839979.html <程序员的自我修养>第二章——编译和链接 2.1 被隐藏了的过程    C语句的经典,“Hello World”程序几乎是每个程序员闭着眼睛都能写出的,编译运行一气呵成,基本成了程序入门和开发环境测试的默认标准. #include <stdio.h> int main() { printf("Hello World\n"); return 0; 在L

笔记《Java程序性能优化 让你的Java程序更快、更稳定》 第二章 设计调优

2.1 善用设计模式 23 (1) 1. 设计模式好处: 2.1.1 单例模式 23 (6) 1. 单例模式是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例: 2. 两大好处:a.对于频繁创建的对象,可以省略创建对象所花费的时间:b.new操作减少,因而对系统内存的使用频率也会降低,降低GC压力,缩短GC停顿时间: 3. 单例模式的参与者:单例类和使用者: 4. 第一种实现方式:私有默认构造器,静态getInstance方法:这种实现方式简单.可靠,但不能延迟

读《高程3》系列之第二章---在HTML中使用script

一.script元素 1,在html页面插入javascript的主要方法,就是利用<script>元素,并定义了如下5个属性(language属性被废弃): *async:可选.表示应该立即下载脚本,但不妨碍也看但其他操作,比如下载其他资源或等待加载其他脚本.只对外部脚本文件有效: *charset:可选.表示通过src属性制定的代码的字符集.由于大多数浏览器会忽略它的值,因此很少用这个属性: *defer:可选.表示脚本可以延迟到文档完全被解析和显示之后再执行,只对外部脚本文件有效. *s

《程序员修炼之道》——第二章 注重实效的途径(一)

七.重复的危害 我们觉得,可靠地开发软件.并让我们的开发更易于理解和维护的唯一途径,是遵循我们称之为DRY的原则: 系统中的每一项知识都必须具有单一.无歧义.权威的表示. DRY-Don't Repeat Yourself.    不要重复你自己. 与此不同的做法是在两个或更多的地方表达同一事物.如果你改变其中一处,你必须记得改变其他各处.或者,就像那些异型计算机,你的程序将因为自相矛盾而被迫屈服.这不是你是否能记住的问题,而是你何时忘记的问题. 重复是怎样发生的 我们所见到的大多数重复都可归入

程序是怎样跑起来的第一章读后感

对程序员来说CPU是什么 首先要了解的是CPU的组成CPU是由寄存器.控制器.运算器.时钟组成的,它的运行是由程序启动后,根据时钟信号,控制器从内存中读取指令和数据.通过对这些指令加以解释和运行,运算器对数据进行运算,控制器根据该运算结果来控制计算机.(除数据运算之外的处理都是控制)本章又重点讲了寄存器--使用高级编程语言编写的程序会在编译后转换成机器语言,然后再通过CPU内部 的寄存器来处理.起作用在得到数据后有一个进行处理的地方像是一个加工东西的房间.那现在来看的话CPU对我们程序员来说像是

《编写高质量代码 改善python程序的91个建议》第二章 惯用法 8-18

建议8:调试语句assert expression, "sentence", python -O xx.py 可以禁用断言,建议少用断言: 建议9:数据交换不推荐使用中间值 语句执行时间: from timeit import Timer Timer('x,y = y,x').timeit() ## x,y = y,x 相当于元组(x,y)= (y,x) 涉及packing和unpacking def swap() x = 2 y = 3 x,y = y,x import disdis

《编写高质量代码 改善python程序的91个建议》第二章 基础语法 19-35

建议19:有节制使用from...import... import    VS  from...import.... import  test                  ##  test 进入局部命令空间 + 进入系统模块字典中 sys.module['test']: from test  import  a      ##  a 进入局部命令空间  + test进入系统模块字典中(a 不在系统模块字典中): ## test_import.py from a import add fro

读《程序是怎样跑起来的》第二章有感

在学c#的时候书上提到过左移右移,不过并没有作为重点来讲,只是大概地说了一下是什么含义.刚看第二章作者提出的六个问题就有四个难住了我.比如一串二进制数左移两位会变成原数的几倍.还有补码形式表示的八进制如何用二进制表示等等,这些问题一点都不会.不过看完答案和作者给出的解析后大概理解了. 第一小节讲了计算机为什么用二进制表示信息,然后第二节讲了什么是二进制数,以及二进制转化为十进制的方法,接着后面讲了如何使用移位运算代替乘除运算,现在我理解老师上课说计算机中也可以使用乘除运算是怎么回事了.最后是我最

读《程序是怎样跑起来的》第八章有感

这一章主要是讲的源文件和可执行文件(EXE文件),计算机只能运行本地代码,本地代码是CPU可以解析和运行的程序,而并不能直接解析和运行源代码,这是因为作为计算机大脑的CPU只能解释已经转换成本地代码的程序内容. 对CPU来说母语就是机器语言,而转换成机器语言的程序就是本地代码,用任何语言编写的源代码,最后都要翻译成本地代码.否则CPU就不能理解了,我感觉CPU跟我还蛮像的,你要是跟我说方言或者其他国家的语言我也听不懂,只能听懂汉语.哈哈,开个小玩笑,也就是说,即使是用不同编程语言编写的代码 .转