00_预备知识
·了解计算机
通俗地讲,计算机是个“超级工具”,是个能执行命令的电子设备。几乎所有的计算机都遵循冯·诺伊曼的“存储--运行”结构,它将计算机主要分为以下5个部分:输入、输出、存储器、运算器和控制器。冯·诺伊曼体系结构如图1所示:
图1 计算机组成
采用该存储结构的工作原理:把计算过程描述为由许多条命令按一定顺序组成的程序,然后把程序和所需要的数据一起输入计算机存储器中保存起来,工作时控制器执行程序,控制计算机自动连续进行运算。
·了解相关的硬件和软件知识
我们知道计算机主要是由硬件和软件组成。
其中,计算机的硬件主要有中央处理器(CPU, Central Processing Unit)、内存(或称主存、随机存储器、RAM――Random Access Memory)、输入/输出设备(Input/Output Devices)和外部存储设备(Secondary Storage,多数为具备海量存储能力的硬盘)
CPU:计算机系统中的“大脑”。它从内存中取指令并执行它们。其基本工作过程是提取指令、译码分析、执行指令。其内部有若干寄存器,其中一类是通用寄存器,用来存放关键变量和中间结果;另外一类是专用寄存器,如程序计数器(PC),子程序返回(LR),堆栈指针寄存器(SP),程序状态寄存器(PSR)。PC保存下一条要执行的指令的地址;LR保存现场地址;SP保存内存栈当前帧面的首地址,栈中保存函数调用时的数据信息;PSR保存当前处理器的执行状态。
存储器:内存和外存,内存容量一般是1G~8G,外存主要是指硬盘,其容量现在基本上已经是以TB为单位了。CPU不能直接存储磁盘上的信息,所以必须先将保存在磁盘上的数据和代码加载到内存之后才能被CPU访问。
软件主要分为系统软件和应用软件。
系统软件是用来控制计算机,管理计算机上的资源,使计算机的硬件有效起作用的。在系统启动时装载入内存的程序集合称为操作系统,没有操作系统的计算机什么也干不了,操作系统除了进行内存管理、文件管理和输入输出管理外,一般都提供了很多系统级的服务供用户调用。但不要认为操作系统程序是多么的高深莫测,从本质上所,它也是用程序设计语言写出来的。只要你掌握了程序设计的原理和硬件系统的相关知识,你甚至可以写出自己的操作系统。除了操作系统外,设备驱动程序和其他一些管理工具也可以归入系统软件的范畴。常见的操作系统:DOS、WINDOWS、UNIX、LINUX
应用软件Application,尽管系统软件虽然能有效处理计算机的内部功能,协助计算机使用外围设备,但却没有把计算机转化成可以写报告,练打字,看电影等多用途的机器,想要实现这些功能,需要安装应用软件。应用软件程序面向特定的应用,如WORD用来处理文字,EXCEL用来记录数据,还有供娱乐的游戏程序等等
·语言简介
语言在人类的交流中的作用无可取代,要想交流通畅,有共同的语言是首要条件,打个比方,一个中国人想和一个英国人聊天,光靠比划手势是不行的,有两条路可以选,要么学习英语,要么找一个翻译。计算机程序设计同样如此,计算机是无生命无知觉的机器,不懂人类的语言,不管是汉语还是英语,计算机都不会接受,人类要想和其交流,让计算机完成特定的任务,必须解决“语言”的问题。同样,人类和计算机交流同样有两条路:要么学习机器语言,要么找一个“翻译”。
语言发展:机器语言->汇编语言->高级语言(又分为:面向过程、面向对象),如图2:
图2 语言的发展
机器语言:计算机是一种电子设备,计算机处理的是数字信号。数字信号采用0和1记录信息,那么计算机的语言,称为机器语言(Machine Language),自然也就是0和1序列。数字0和1称为二进制数据(Binary Digit),或者称为位(Bit),这种0和1的序列就称为二进制代码。
汇编语言(Assembly Language):汇编的出现简化了程序员的工作,在汇编语言中,用便于记忆的方法定义程序指令。
高级语言:既然机器语言和汇编语言都是计算机可以理解的语言,用其可以完全控制计算机的行为,那么为什么人们还要创造并使用高级程序设计语言呢?因为机器语言和汇编语言都是低级语言,是面向机器的,与具体的计算机相关。学习起来困难,编程效率也低,可读性、可维护性也差。
还是举个例子,一个说普通话的北京人想要去欧洲旅行,可是他不懂任何一门欧洲语言;恰好,一个说粤语的广东人也去欧洲旅行,而且,他懂得德语、英语、法语、西班牙语等所有欧洲语言,他们结伴同行。北京人想要同欧洲人交流,有两种方式:一是学习各种欧洲语言,然后同各个国家的人直接交流;二是让广东人当翻译,将自己的意思讲给欧洲人听,并将欧洲人的回答反馈给自己。如果您是那个北京人,您选择哪种方式?我想答案是确定的,肯定要请广东人当翻译。虽然普通话和粤语也有一定的差异,但是比起同欧洲语言的差异来,这种差异小了很多。况且,如果直接同欧洲人交流,需要学习多少门语言?
高级语言和计算机的关系,与北京人的语言和欧洲人的关系相似。高级语言编写的程序借助于编译器就可以在特定的机器上运行,不同的欧洲人相当于不同的计算机,广东人相当于编译器,普通话相当于计算机高级语言。
·程序的概念
计算机程序规定了计算机要执行哪些动作及这些动作应当按什么顺序来执行,如同菜谱规定了厨师做菜的材料和步骤。
著名的计算机科学家Nikiklaus Wirth提出了一个公式:
程序 = 数据结构 + 算法。
数据结构:即数据的存储形式,程序用到的信息。
算法:操作步骤,对操作的描述,程序用什么方法解决问题。
·编译原理
编译原理如图3:
图3 编译原理
·程序执行流程
程序执行流程如图4:
图4 程序执行流程
·原码、反码、补码
·原码:将最高位作为符号位(0代表正,1代表负),其余各位代表数值本身的绝对值(以二进制表示)。
为了简单起见,我们用1个字节来表示一个整数。实例如下:
+7的原码为:00000111
-7的原码为: 10000111
·反码:一个数如果为正,则它的反码与原码相同;一个数如果为负,则符号位为1,其余各位是对原码取反。
为了简单起见,我们用1个字节来表示一个整数。实例如下:
+7的反码为:00000111
-7的反码为: 11111000
·补码:一个数如果为正,则它的原码、反码、补码相同;一个数如果为负,则符号位为1(保持不变),其余各位是对原码取反,然后整个数加1。另外,在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位进的1会被丢弃。如下:
1 00000000 进位1被丢弃。
为了简单起见,我们用1个字节来表示一个整数。
+7的补码为:00000111
-7的补码为: 11111001
计算机中数的存储是以补码的形式存储的。最高位是符号位,0表示整数,1表示负数。
正数的原码、补码、反码都相同
Eg: short a = 1; 则原码、补码、反码都是00000000 00000001
负数的补码是将原码符号位不变,其余按位取反后加1.
Eg: short b = -2; 则原码:10000000 00000010 补码为11111111 11111110
二进制的负数转换为十进制表示需要通过补码转换的:
(1)比如:short a=1;
二进制表示为00000000 00000001
(2)short b=~a;
即则b为对a的每位取反,结果b = 11111111 11111110; 用16进制表示为0xFFFE
如果转换为十进制,则要转换为补码(补码的原则是原码的符号位不变,其余位数取反,然后将结果加1):
10000000 00000001+1=10000000 00000010
显示出来就是-2。
(一个数按位取反之后的数为它的相反数-1)
那么为什么需要补码呢?
这是因为计算机没有减法运算,减法运算都是通过补码实现的,举例如下:
假设两个short类型的数据,如何实现2 - 1 运算呢?
实际上计算机是用2+(-1的补码)来完成的
2的表示是 00000000 00000010
-1的原码是10000000 00000001
-1的补码是11111111 11111111
2-1=2+(-1的补码)
2 00000000 00000010
-1的补码 11111111 11111111
计算结果: 00000000 00000001
(运算规则:0+0=0 1+0=1 0+1=1 1+1=10)
那么如果计算结果出现负数怎么办呢?
1-2=1+(-2的补码)
1 00000000 00000001
-2的补码(符号位不变,原码取反+1) 11111111 11111110
计算结果: 11111111 11111111
用十进制表示,则要转换为补码显示出来,则为10000000 00000001 即-1
感谢阅读。如果感觉此章对您有帮助,却又不想白瞟