下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一 从C应如高级程序设计语言中的数据类高级程序设计语言中的数据类型的种类与计算一 从C应如高级程序设计语言中的数据类高级程序设计语言中的数据类型的种类与计算机硬件所能支持的(位数)据构造有关高级程序设计语言中的数据长度与计算机的机器字长和指令种类关编译器和程序编译产生的程序处理同一数据类型的过程存在差异数据类型符号与机器字长的关系对例1:已知某计算机机器字长16 位,下述C 语句的执行结果i=40000;/*若字长是32 位,可以令分析先将 i 变换为十六进数得40000=0X9c40(若字长是 32 位且i=2150000000,则 i 变换的十六进数值为 i 为有符号整(即将占用一位数的符
2、号位且符号位为 1(即为负数编译系统将计算其视为补码(即-0X63c0因此执行后的输出结果-数据类型符所对应的机器、整数字(有、无符号short、unsigned 整数半字(有、无符号long、unsigned整数双字(有、无符号char、unsigned整数字节(有、无符号浮点数浮点数long浮点数四字(倍双字造成思路偏差的关键是数在编译转换与输出转换是先后两个不同的环节。很难有学生能将在内存中的造成思路偏差的关键是数在编译转换与输出转换是先后两个不同的环节。很难有学生能将在内存中的数据处理与输入输出时进行的转换之间的关系想明例 2:已知某程序内的初始数为:char* p=”acd”;当该程
3、序运某时刻时使指针指向字符串内字符c的位置判断下述四条 C 语中哪一条能够正确取得该字符串内的字符*p-(B) *-(C) *p-(D) *(p-分析:地址数值为同长、同类型数据,故该计算将涉及到多先策略(即地址变更与对地址的一次间的优先策略。当复合生地址变换与访内操作时则要是各自运算符号的相对位置而定。因此很容易的判断出(B)是正确该问题正确解答的关键是正解间接寻址和的顺序规则例3:试说明C 语句“i+j;”的计算策略分析:编译扫描自左向右,故判断操作对象与运算的关系应形成和j两个部分,又”i+”为一元运算,故先予计算。若编译器的扫描方逆转,则先计算+j 也是正确使用不同的数据类型与数据长度
4、时应考虑其相互间的(编译)则例4:试判断出下述C 程序的执行结果16 位字长的代码long32 位字长的代码long s,l=5; unsignedshortcharc=-charc=-s=l+u*c;/*预期值为-s=l+u*(unsigned short)c;/*预期值为-7,但际值为262137,即f(“%ld”,f(%ld,分析:u*c 中的c 先转换成无符号整s=l+u*c;/*预期值为-s=l+u*(unsigned short)c;/*预期值为-7,但际值为262137,即f(“%ld”,f(%ld,分析:u*c 中的c 先转换成无符号整数(d后完成u*c 计(乘4 即左移两位)
5、并获得中间结果 4。为计算 l 与该中间结和则先使无符号整数的中间结果转换l 相同的有符号双字(4s=65529(即9。与预期值不一致的根本原在于 c 经历了两次符号间的转换。如果在开始计算之前便使所有计值都一致,则此问题就可以避免了。既将“s=l+u*c;” 语句改“s=l+(long)u*c;”。在 VC7 以后的编译器中可以省略强本例的思考点任何编译器所支持的数据类型转换策略都只能适用于有限的环境在对所使开发工具具有的多种转换策略不了解的情况下获得产品存在缺陷是必然的本例中所用到的不同数据类型转换策略如下无符号整数短长补长短:截有符号整数短长:正补零;负补长短:截由此可以得到以下结使用不
6、同的数据类型的混合计算必须考虑由编译系统预先设定的策略(如长度转换策略、符号转换策略、数值精度转换策略、多重处转换的优先策略等使用不同的运算符号所组成的混合数据类型计算,编译器策略(如长度转换策略、符号转换策略、数值精度转换策略、多重处转换的优先策略等使用不同的运算符号所组成的混合数据类型计算,编译器会安依照符元数优先策略生成机器代指针是地址数据,经指针的访内操作是机器指令的间址操作指针类型是用来决定指针所代表的地址数据的变址的理论上不同类型的指针也可以强制,但从安全观点用小地的指针强制指向较大刻度的指针5:若机器字长为16 位,试判断下述C 语句的执行结果longchar*f(“%x”,*p
7、);/*若将p 分别改为p+1 p+3,则结果如何分析:在机器字长为16 位的计算机内,long 类型字长度对其进行字节类型char 强制时,将按字节取出对应内存的long 类型数据的内存布局如下所述,故输出结果为 1低位字低位字字节 低位字字在 C 语言内的数组与指针的处理机制大体相同,根本区别是数组读的指从函看不同执行程序单元间程序开发的过程看,必须(确定名称和数据类型、定义(赋予名称的实体意义、最(执行程序的机器代码P使用参数单向传递是出于保护各自过程作用域数据的目的使用全程变量或指针作参数可以使用参数单向传递是出于保护各自过程作用域数据的目的使用全程变量或指针作参数可以实现数据的双向传
8、递(但不能定制函数的返回数据若是指针,则可以对其进行任何指针允许的操作例 6:试判断下述程序执行后的输出结果*returnvoid分析:对执行f 函数后所返回的变量pub 的地址作间得到其内再与被加数相加,等效于 3+4+5=12C/C+程序内函数与数据具有等价的地位(函数型指针为典型代表函数型指针返回的指针数据类型(*函数指针名(参数类例 7:函数型指针的应用,pf=&max;/*函数地址附值rs=pf(9.0,2.4);/* 函数指的简化形式在 C 程序内函数型指针多以函数的参数出现在虚函数中虚函数格式返回类型 在 C 程序内函数型指针多以函数的参数出现在虚函数中虚函数格式返回类型 函数名
9、(参数类型,指针类型(*(参数虚函数的定义格式返回类型 函数(参数名 1(*虚函数名(参数代码体例 8:利用虚函数设计的求圆周长和面积 C 程序代constfloatfloatcircle_len(floatradio)returnfloat circle_area(float radio)return pai* radio *radio; floatcircle_js(floatradio,float(*f)(float)returnf(radio); void main()float有限程序作用的概程序加工的对象是数据数据在其生命周期内分为全程(局即 global)和局部(local某个特
10、定数据只与某段程序的特定处理相关,最具体的体现为 语言的类别和运行期的变量生命周期的控制C 语言内四种附类extern的数据在作用域之;ic的数据的生命周期不作用域的影响auto的数据的生命周期仅作用域register的数据须在寄存器内完成计例 9:试判断执行该程序后的结void分析:两个i 的生命周期别分是global local,auto的数据的生命周期仅作用域register的数据须在寄存器内完成计例 9:试判断执行该程序后的结void分析:两个i 的生命周期别分是global local,则其对应的类别分别是icauto。因f 函数处在main 函数的作用域内,所该域内的i 变量,故输
11、出结果1首编译器提供的内存内存模式是根据不同的程序代码与数据规模而预先设定的程序在运行时的内存驻留格局。内存模式通过 C 编译附加参数设定根据代码和数据的内存驻留格局可以分为 tiny、small、mediumcompact、largehuge等模式十六位计算机为例的C当只是一个局部的数据需要改变内存驻留格局时可以使用编译附模函数代数据默认调用的库段段地址段段地址唯与代码段共用唯唯多唯唯多多多多多存模式保留字通知编译器(C 的内存模式保留字有 near、far、huge在使用时应遵守如下约定同类存模式保留字通知编译器(C 的内存模式保留字有 near、far、huge在使用时应遵守如下约定同类
12、的附加关键字要一farad( far,(far,三个模式附加关键字只能顺向转三个模式附加关键字不能改变已(库函数的返回值类doublefarvoidf(“%f”,sin(.5);/*显示结直接C 语言使用段和段基语句可直接访内。段和段基语句的关键字为_segment 段名=内址_based(段名) 段偏移名=偏移值与其配套的算_segment sg=0 xb800; unsignedchar_based(sg)*p=0;简单的彩色属若使用配套的算符则*(p+i)=0 x84 一项可改写为二一些C 例 13二一些C 例 13:可将前一例改为如_asm汇编程序例 14:已知主频为 40MHz(即周
13、期为 0.025s)的某接口,欲对其最位打入一个 1s 的脉冲,可在 C 程序中嵌入如下的汇编程序#define#definevoid目的:在 C 编译阶段实现一些区段动态的符号替换格式:#预处理指示关参量替换预处理语句#include”常数例#define pai 3.14 #definepai2(pai+pai)常数不是常量;括号不能少替换预处理语句#include”常数例#define pai 3.14 #definepai2(pai+pai)常数不是常量;括号不能少变量17:#definea#define#define#define C 语言中的宏实际上是在编译之前由编译器完成的一种符
14、号集群替换。因此,切不可将之与。依据替换位置的不同,C 语言的宏又有所谓宏函数和宏过程之分如:#define max(x,y) (x)(y)?(x):(y)是宏函而:#definepti(nf(“%d”,n)和#definept(sf(“s”)就是宏过使用宏的最大问题是容易产生二意#define sq(x)void main()%d”,j,i);/*显示结果为:12 而不是 代名代名符#define sq(x)void main()%d”,j,i);/*显示结果为:12 而不是 代名代名符是一种特殊的常数代#define TEST TESTvoidmain()在替换中使用参由于#define
15、语句本身的作用就是在通知编译器如何进行各种符号C 语言还专门提供了一个特殊的符号作为未来的参数标识,被称为符号参数。符号参数用“#”和“#”表示。前者意为处换;后者意在处的变量名续#define pr(x) pr#define pai1 3.14#definepai2#definepaiout(x)void/*输出结果为paiout(2); /*输出结果为#define alfa(x,y)void ();void#undefalfa#definealfa2.72 void sb()内存的动态实模式下 C 程序的静态内存#define alfa(x,y)void ();void#undefalf
16、a#definealfa2.72 void sb()内存的动态实模式下 C 程序的静态内存堆栈区可以通过编译参数设定,但最大不超过 动态的占用不同位置的内存需通过使用不同的内存分配库数实现内存的动态分配库函数的内存的动态分配库函数均由位于 malloc.h 的头文件中予。(1)动态占用本地堆栈区的库函数 void* 特点:最大容量小于 32KB;无须使用库函;(2)动态占用程序内数据区的库函数 void* 特点:最大容量可达 64KB;要使用库函数“void 所两 者均为 堆栈 区,默认容量为 2048 字节程序代公共全程、静态分配区默认DS、态分配的程序内数据(nearSP(顶本地栈局部动态数据占用区态分配的外部堆数据(far内存(3)动态占用外部数据区的库函数 void far* 特点:最大容量视剩余内存容量而定内存(3)动态占用外部数据区的库函数 void far* 特点:最大容量视剩余内存容量而定;以 64KB 自动分段;要用库函数“void_ffree(void所占内存(4)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年福州市劳动协议格式
- 安保岗位聘用协议范本2024年限定
- 2024事业单位劳动协议定制样本
- 2024年不变单价服务协议格式
- 2024年债务以资抵债协议样本
- 2024房产中介服务协议模板
- DB11∕T 1671-2019 户用并网光伏发电系统电气安全设计技术要求
- 2024高效货车驾驶员专属聘请协议
- 二手电动摩托车交易协议2024年
- 2024年借款融资居间协议格式
- LX-2010高压电网系统设计方案(看守所、监狱)
- 苏州市存量房买卖合同
- 精选薛店好声音ktv组织机构章程资料
- 电梯广告效果评估分析
- 光伏电站检测报告模板
- 淡雅古典诗词中国风PPT模板
- 施工方案-悬挑平台施工方案
- 基于学科核心素养下提升小学生英语语言能力的路径研究
- 标准电线平方数和直径一览表
- 工程参建各方责任主体开展质量安全提升行动责任清单
- ISO9000质量管理体系(收藏)
评论
0/150
提交评论