从C程序设计的系统总结看现代计算机程序设计的微观.doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:14 大小:95KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

从C程序设计的系统总结看现代计算机程序设计的微观.doc

从C程序设计的系统总结看现代计算机程序设计的微观.doc

预览

免费试读已结束,剩余 4 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

从C程序设计的系统总结看现代计算机程序设计的微观⒈应如何看待高级程序设计语言中的数据类型·高级程序设计语言中的数据类型的种类与计算机硬件所能支持的数(位数)据构造有关;·高级程序设计语言中的数据长度与计算机的机器字长和指令种类有关;数据类型符号与机器字长的关系对照表数据类型符号所对应的机器字长int、unsignedint整数字(有、无符号)short、unsignedshort整数半字(有、无符号)long、unsignedlong整数双字(有、无符号)char、unsignedchar整数字节(有、无符号)Float浮点数字double浮点数双字longdouble浮点数四字(倍双字)例1:已知某计算机机器字长16位,试指出下述C语句的执行结果。inti=40000;/*若字长是32位,可以令i=2150000000*/Printf(“%d”,i);分析:先将i变换为十六进数得:40000=0X9c40(若字长是32位且i=2150000000,则i变换的十六进数值为9X80266580)∵i为有符号整数(即将占用一位数的符号位)且符号位为1(即为负数)∴编译系统将计算其视为补码(即-0X63c0),因此执行后的输出结果为-25536例2:已知某程序内的初始数据声明为:char*p=”acd”;当该程序运行到某时刻时,使指针指向字符串内字符‘c’的位置,试判断下述四条C语句中哪一条能够正确取得该字符串内的字符‘a’?(A)*p--;(B)*--p;(C)*p-1;(D)*(p--)分析:地址数值为同长、同类型数据,故该计算将涉及到多重转换的优先策略(即地址变更与对地址的一次间址访问的优先策略)。当复合发生地址变换与访内操作时则要是各自运算符号的相对位置而定。因此可很容易的判断出(B)是正确的语句。·使用不同的数据类型的混合计算必须考虑由编译系统预先嵌入的变换策略(如长度转换策略、符号转换策略、数值精度转换策略、多重处理转换的优先策略等);·使用不同的运算符号所组成的混合计算,编译器会安依照算符元数优先策略生成机器代码;例3:试说明C语句“i+++j;”的计算策略。分析:编译扫描自左向右,故判断操作对象与运算的关系应形成”i++”和’j’两个部分,又”i++”为一元运算,故先予计算。·使用不同的数据类型与数据长度时应考虑其相互间的(编译)变换过程;例4:试判断出下述C程序的执行结果:在VC6以前的16位字长的代码:在VC7以后的32位字长的代码:longs,l=5;longs,l=5;unsignedintu=4;unsignedshortu=4;charc=-3;/*0Xfd*/charc=-3;/*0Xfd*/s=l+u*c;/*预期值为-7*/s=l+u*(unsignedshort)c;/*预期值为-7,但实际值为262137,即0X3FFF9*/printf(“%ld”,s);printf("%ld",s);分析:u*c中的c先转换成无符号整数(即0Xfffd),然后完成u*c计算(乘4即左移两位)并获得中间结果0Xfff4。为计算l与该中间结果的和则先使无符号整数的中间结果转换为与l相同的有符号双字(即0X0000fff4),则s=65529(即0X0000fff9)。与预期值不一致的根本原因在于c经历了两次符号间的转换。如果在开始计算之前便使所有计算量值都一致,则此问题就可以避免了。既将“s=l+u*c;”语句改为“s=l+(long)u*c;”。在VC7以后的编译器中可以省略强制。本例的思考点:·任何编译器所支持的数据类型转换策略都只能适用于有限的环境;·在对所使用的软件开发工具具有的多种转换策略不了解的情况下开放获得的软件产品存在缺陷是必然的;上例中所用到的不同数据类型转换策略如下:(一)无符号整数之间短→长:高位补零长→短:截去高位(二)有符号整数之间短→长:正数高位补零;负数高位补一长→短:截去高位·指针是地址数据,经指针的访内操作是机器指令的间址操作;P·指针类型是用来决定指针所代表的地址数据的计算单位的;·理论上不同类型的指针也可以强制,但从安全观点考虑最好用小刻度地址单位的指针强制较大刻度的指针;例5:若机器字长为16位,试判断下述C语句的执行结果。longl=1;char*p=(char*)&l;printf(“%x”,*p);/*若将p分别改为p+1和p+3,则结果如何?*/分析:在机器字长为16位的计算机内,long类型占用双字长度,而当对其进行字节类型的char强制时,将按字节取出对应内存的数据。因long类型数据的