2020/2/101主讲教师:***个人主页:***2020/2/102教材:《C语言程序设计(C99版)》陈良银游洪跃李旭伟主编李志蜀唐宁九李涛主审清华大学出版社2006年9月出版2020/2/103本书内容第1章基础知识第2章C语言的基本要素第3章变量名、数据类型、运算符和表达式第4章C程序基本控制结构第5章函数第6章数组和指针第7章递归第8章结构、联合、位运算和枚举类型第9章预处理命令第10章文件第11章高级话题第12章C89VsC99实验(待安排)2020/2/104数据在计算机内的表示本章主要内容ARMVectorTableFIQIRQ(Reserved)DataAbortPrefetchAbortSoftwareInterruptUndefinedInstructionReset0x1C0x180x140x100x0C0x080x040x00132计算机语言计算机系统及基本工作原理4算法和数据结构5C语言标准6编程风格介绍2020/2/105本章的节本要求•了解计算机的基本组成结构及其基本工作原理•熟悉内存组织结构、内存地址概念•熟悉数据在存储器中的布局结构•深入理解计算机基本工作原理、内存地址概念、C程序数据分区等基本内容•方法——从总体结构入手、深入结构细节2020/2/1061.1计算机系统•计算机系统包含了硬件系统和软件系统两大部分。•计算机硬件系统主要由运算器、控制器、存储器、输入设备和输出设备五大部件组成。•计算机软件系统又分为系统软件和应用软件两大部分。2020/2/107图1.1计算机系统基本组成计算机系统硬件系统软件系统主机外部设备系统软件应用软件中央处理器内存储器输入设备输出设备外存储器文字处理软件表格处理软件辅助设计软件实时控制软件操作系统语言处理系统系统服务程序数据库管理系统运算器控制器只读存储器随机存储器编译程序解释程序汇编程序连接编辑程序连接装配程序调试程序其他服务程序2020/2/1081.1.1计算机的硬件系统•硬件(Hardware)——是计算机的物理实体部分。•计算机处理信息的过程有点类似人的大脑处理信息的过程。•计算机五大部件之间是否也可以通过什么“线”来相互传递信号啦?•地址线(传递地址信号)、数据线(传递数据信号)和控制线(传递控制信号)。2020/2/109•把计算机系统的所有地址线统称为地址总线,所有数据线统称为数据总线,所有控制线统称为控制总线。•而地址总线、数据总线和控制总线合在一起统称为计算机系统总线。•计算机五大部件之间正是通过这些总线(地址总线、数据总线和控制总线)相互连接、相互联系的。2020/2/1010系统总线存储器运算器控制器适配器输入设备输出设备CPU主机2020/2/1011•为什么计算机需要以上三种总线啦?这必须吗?•输入设备——输入设备将信息从外界输入到计算机中。•控制器——控制器实际上就是计算机的指挥中心。•运算器——运算器的主要工作就是完成算术、逻辑运算。•存储器——存储器是计算机的记忆装置。•输出设备——输出设备是计算机的一个执行装置。2020/2/1012•计算机如何进行3+2这样的简单操作?•控制信号就是通过控制总线传递的。•数据信号通过数据总线进行传递。•那么计算机为何需要地址信号?地址信号起什么作用啦?•没有地址信号线,计算机就不可能准确找到某一个内存单元。2020/2/1013•为了区分不同的存储单元,每个存储单元都有一个独一无二的编号,这个编号实际上就是该存储单元的地址。•计算机的内存空间主要分为三个区:系统程序区、应用程序区和数据区,其中数据区又分为系统程序数据区和应用程序数据区两类。2020/2/1014图1.3C语言变量的存储类型与硬件的关系运算器控制器寄存器register型变量系统程序区应用程序区静态数据区static型堆栈区auto堆区CPU存储器三总线2020/2/1015•在一个通用计算机系统中,以上三种总线缺一不可。•把计算机的内存储器的每一个存储单元从上向下依次叠放起来。把存储器的存储单元按照编号顺序排成一竖排。2020/2/10160x200000050x200000040x200000030x200000020x200000010x200000000x000000000xFFFFFFFF0x180x100000030x100000020x100000010x10000000图1.4存储器的抽象结构101010102020/2/1017•什么是“位”呀?•其实位是计算机信息表示的最小单位。计算机是通过存储0和1的不同编码组合来表示信息的。•0和1的不同组合就是编码。•由于每一位要么存放0、要么存放1,只有这两种选择,一共有8次选择的可能,所以总共有256种不同的组合,也就是说0x20000000存储单元就可以表示256种不同的信息。只有0和12020/2/1018•8位这其实就是“字节”的概念,计算机里的字节固定就是8位,一个字节占据一个存储单元。•绝大部分计算机的地址编码也是按照字节来进行编号的,也就是说一个地址编码对应了一个字节存储空间(8位)。•存储单元的编号也就是地址编号(即地址编码)。1字节=8位2020/2/1019•计算机系统地址位数决定了其存储空间的大小。•地址系统只有20位,则内存单元只有1M字节。•地址系统有32位,则内存单元只有4G字节。地址总线位数决定地址编码范围。2020/2/1020•计算机系统的地址位数与C程序的指针长度密切相关。•指针变量的意思很简单——就是一个用来存放编号(也就是内存地址即指针值)的变量,也就是说用来存放地址编号的变量叫指针变量。•指针变量(指针变量就是用来存放地址的变量)所占用的存储空间大小就是地址编号的位数。地址总线位数决定地址指针变量长度2020/2/10211.1.2计算机的软件系统•软件(Software)——是计算机实现各种功能的程序、文档和数据的集合。•系统软件包括操作系统和各种语言处理软件等。•应用软件主要包括各个行业或者领域的功能处理软件。2020/2/1022图1.5计算机软件系统各种语言处理软件操作系统硬件应用软件系统软件2020/2/10231.2计算机的基本工作原理•冯·诺依曼(Neumann)定义了现代计算机的基本结构,其特点是:•硬件系统由五大部件组成,各部件具有独立的基本功能。•采用二进制形式表示数据和指令。二进制用来表示信息的基本符号只有两个:0和1。2020/2/1024存储程序的基本原理•计算机在执行程序和处理数据时必须首先将程序和数据存储在主存储器中,计算机工作时自动高速地从主存储器中取出指令并加以分析、执行。存储程序、自动执行2020/2/1025图1.6图灵机的基本组成结构读写头存储带2020/2/10260x340x120x200000050x200000040x200000030x200000020x200000010x200000000x000000000xFFFFFFFF0x100000030x100000020x100000010x10000000图1.7读写头的移动10101010读写头地址编号存储单元存储内容2020/2/1027•根据存储程序的基本原理,计算机执行的指令需要预先存放在计算机的存储器中,也就是内存储器中。•计算机程序的指令系列按照地址顺序依次存放在这些存储单元中。•地址也就是计算机存储单元的编号。•存储器的每个地址对应了一个唯一的存储单元,反过来,每个存储单元都对应了一个唯一的地址。2020/2/1028•计算机工作的过程就是不断地从这些存储单元取出指令、分析指令并执行指令的过程。•计算机究竟应该从哪一个存储单元取指令则完全依赖于计算机CPU内的程序计数器值,程序计数器是CPU内的一个特殊计数器,其中存放的就是将要取出的下一条指令的存储单元地址。表示了读写头的位置2020/2/1029•程序对某一个变量的操作实际上就是对这个变量所在的存储单元的操作。•C程序中的地址概念实际就是变量所在的存储单元的地址编号。•不同的变量可能占据不同个数的存储单元,存放变量的第一个存储单元的地址就是该变量的地址。变量的地址等于“首地址”2020/2/10301.2.3C程序的内存分区•计算机的存储器是分段组织的。•分成程序段(程序区)和数据段(数据区)……。•数据存储区分为了静态数据存储区和动态数据存储区两个部分,分别简称静态存储区和动态存储区。•动态存储区又分为“堆”和“堆栈”两种结构形式。2020/2/1031•“堆栈”空间大小有限,采用“先进后出”的方式管理其数据,而且C编译器或操作系统自动管理该部分空间,且其大小有限;•而“堆”空间则可以很大,它的组织方式比较灵活,需要程序员自己管理。•堆栈的效率比堆的效率明显高很多。•2020/2/1032•C编译器将计算机内存分配方式分为以下三种:•1.在静态存储区中分配——外部变量、static变量。•2.在动态存储区的“堆栈”上分配。•3.在动态存储区的“堆”上分配,亦称动态内存分配。程序员用malloc()函数申请堆内存,用free()函数释放堆内存。2020/2/10330x200000050x200000040x200000030x200000020x200000010x200000000x000000000xFFFFFFFF0x100000030x100000020x100000010x10000000图1.9内存分区10101010读写头0x400000050x400000040x400000030x400000020x400000010x40000000101010100x3000FFFF0x3000FFFE0x3000FFFD0x3000FFFC0x3000FFFB10101010静态数据区堆栈区堆区程序区数据区2020/2/1034图1.8内存数据区分区静态存储区堆栈区堆区永久生命周期局部生命周期用户自己管理其生命周期2020/2/10351.3计算机语言•计算机语言分为三类:机器语言、汇编语言和高级语言。•机器语言是计算机能够直接识别和处理的二进制机器指令;“01010101”。•汇编语言是符号化了的机器语言,也就是用一些符号来表示二进制机器语言;“MOVAX,BX;”。•而高级语言则是更符合人类思维特性的抽象语言。“y=x*x;”。2020/2/10361.4数据在计算机内的表示•在计算机中,用0和1的不同组合来表示不同的信息。•00001001”究竟是表示1、2或者3啦?为什么它就表示的这个数啦?这涉及到进位计数制和编码的问题。•进位计数制就是用一组特定的数字符号按照一定的进位规则来表示数的计数方法。2020/2/1037•十进制则采用了“0”、“1”......“9”这10个符号。•十六进制就有16个基本符号“0”、“1”......“9”、“A”、“B”、“C”、“D”、“E”、“F”。•八进制表示,有8个基本符号,分别是“0”、“1”......“7”。•涉及“基”和“位权”的概念。2020/2/1038•在C语言中,十六进制表示以0x开头,八进制以0开头,十进制以非0数字开头。•比如:•0x1777(十六进制表示)、•01777(八进制表示)、•1777(十进制表示)。2020/2/1039•所谓“基”,就是在一种进位计数制中所使用的基本符号的个数。•比如:•0x88(正确的十六进制表示)、•088(错误的八进制表示)、•8FF(错误的十进制表示)。2020/2/1040•“位权”实际上就是在某种进制的编码中,某一个位置的基本符号为1时,它所代表的数值的大小。•8648.72D=8×103+6×102+4×101+8×100+7×10-1+2×10-2在这个数中,从左至右的各位数字由于所处位置不同,它们所代表的数值的大小也不相同2020/2/1041•在C语言以外的场合,通常可以用下标2、8、10、16或字母B、O、D、H分别表示二进制、八进制、十进制、十六进制数,•如(11001)B、(354)O、(12