
C语言程序设计案例教程:数据的类型转换.pptx
13页单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2021/9/12,#,数据,的类型转换,Teacher teaching design,CONTENTS,目 录,自动类型转换,强制转换,案例剖析 交流提升,案例分析,仿真演练,自动类型转换,PART,01,自动类型转换,数据类型的转换方法:变量的数据类型是可以转换的转换的方法有两种,一种是自动转换,一种是强制转换自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成自动转换遵循以下规则,:,一,、自动类型转换,(,1,)、自动转换的原则,不同类型的数据可以进行混合运算,但是还要遵循一个原则:一个运算符两侧的操作数的数据类型不同,则系统按“先转换、后运算”的原则混合运算的自动转换规则如图所示,double float,高级,long,unsigned,int char short,低级,(,2,)、转换过程中注意点,说明:,、当同一表达式中各数据的类型不同时,编译程序会自动把它们转变成同一类型后再进行计算转换优先级按上图箭头所示:,char/shorintunsignedlongfloatdouble,即左边级别低的类型向右边转换。
具体地说,若在表达式中优先级最高的数据是,double,型,则此表达式中其他数据均转换成,double,型,且结果也是,double,型;,自动类型,转换,、赋值过程中类型转换:,C,语言赋予了赋值表达式类型转换功能,一旦出现变量和表达式类型不一致时,会自动进行类型转换,将表达式的值向变量类型方向进行转换类型转换有前提必须是相近的且可以转换的才能进行,主要包括如下表中几种情况:,如,设,x,是整型数,,y,是单精度实型数,,z,是双精度实型数,则:,x,+a,的值是整型数;,x+1.5,的值是双精度实型数;,x+y,的值是双精度实型数;,x+y+z,+x,的值 是双精度实型数;,a,+a,的值是整型数,;,y+y,的值也是双精度实型数变量类型,表达式类型,转换方式,整型,实型,截取小数部分,实型,整型,小数部分补,0,单精度实型,双精度型实型,截取小数部分剩,7,位有效数字,双精度实型,单精度实型,小数部分补,0,到,16,位,字符型,整型,低,8,位送至字符变量一个字节的存储单元,整型,字符型,ASC,码送至整型变量低,8,位,若是带符号且,ASC,码最高位为,1,则补,1,否则补,0.,强制转换,PART 02,强制转换,强制转换,(,1,)强制转换的表示形式是:,(,类型说明符,),其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
强制类型转换符的对象是表达式,包括常量,变量,函数和表达式,把圆括号括起来的类型名称放置在预转换的表达式前面例如:,(float)x,把,x,转换为实型,(,int)(a-b),把,a-b,的结果转换为整型,(int)a-b,把,a,转换为整型再与,b,相减,在使用强制转换时应注意以下问题:,1,、类型说明符和表达式都必须加括号,(,单个变量可以不加括号,),,如把,(int)(x+y),写成,(int)x+y,则成了把,x,转换成,int,型之后再与,y,相加了2,、无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型,如下程序所示main(),float,x;,int,y;,x=3.6,;,y,=(int)x;,printf,(%f,%d,x,y);,运行结果为:,3.600000,3,案例剖析,交流提升,PART 03,案例剖析 交流,提升,【,例,1】,、分析以下程序,main(),float a=12.3456;,a=(int)(a*100+0.5)/100.0;,printf(“a=%f”,a);,程序运行的结果为:,a=12.350000,思考分析,:,(,1,)、由于,(int),的作用,,(int)(a*100+0.5),运算的结果为为整型,1235,,,(,2,)、除,100.0,运算时自动转换为实型,12.350000,,所以结果为,12.35,。
2,、强制转换的注意点,、强制转换类型得到的是一个所需类型的中间量,原表达式类型并不发生变化也就是说强制的结果只是把变量值转换成要求的类型后参与所在环境运算,而变量本身的,类型,和,值,并未改变例如,,(double)a,只是将变量,a,的值转换成一个,double,型的中间量,其数据类型并未转换成,double,型如果对一个整体表达式进行类型转换,要注意在表达式前后加上圆括号,以免出现只对表达式前面部分转换的情况如,(int)(x+y),和,(int)x+y,不同:,(int)(x+y),是将,x,和,y,相加后,把结果转换为整型,而,(int)x+y,是把,x,转换成,int,型之后再与,y,相加当有些类型无法转换时,需要强制类型转换的支持案例剖析 交流提升,【,例,2】,main(),float a=12.34;int b;,b=(int)a;,printf(%d,%f,b,a);,程序运行结果:,12,12.340000,b,是,int,型,,a,是,float,类型并不改变3,、无论是强制转换或是自动转换,如果要转换的量超过了转换后类型的表示范围,将出现溢出错误或不可预料的结果。
如:,main(),int a;,float b=123456;,a=b;,printf(“a=%d”,a);,程序运行结果:,a=0,仿真演练,体验探索,PART 04,仿真演练 体验探索,1,、分析下列程序的输出结果是(),main(),double d=3.2;int x,y;,x=1.2;y=(x+3.8)/5.0;,printf(%d n,d*y);,A)3,B)3.2,C)0,D)3.07,思考题:数据类型自动转换对程序输出结果的影响?,2,、数字字符,0,的,ASCII,值为,48,若有以下程序运行后的输出结果是,(),main(),char a=1,b=2;,printf,(%c,b+1);,printf,(%dn,b-a);,A)3,1,B)50,2,C)2,2,D)2,50,思考题:字符型数据与整型数据之间的转换方法?,3,、下列程序执行后的输出结果是,A)G,B)H,C)I,D)J,main(),int x=f;printf(%c n,A+(x-a+1);,思考:允许对字符变量赋以整型值在输出时,允许把字符变量按整型量输出,同样也允许允许对整型变量赋以字符值,把整型量按字符量输出。
仿真演练 体验探索,4,、设有,char w;int x;float y;double z;,则表达式,w*x+z-y,值的数据类型为(,),A)float,B)char,C)int,D)double,5,、已知大写字母,A,的,ASCII,码值是,65,,小写字母,a,的,ASCII,码是,97,,则用八进制表示的字符常量,101,是,(,),A),字符,A,B,),字符,a,C),字符,e,D),非法的常量,6,、若变量,a,是,int,类型,并执行了语句:,a=,A+,1.6,;,则正确的叙述是(,),A)a,的值是字符,C,B)a,的值是浮点型,C),不允许字符型和浮点型相加,D)a,的值是字符,A,的,ASCII,值加上,1,7,、以下程序的输出结果是,(,),main(),char c=z;,printf,(%c,c-25);,A)a,B)Z,C)z-25,D)y,8,、以下程序的运行结果,为:(,),main(),float,x=1.6546,y;,y,=(int)(x*1000+0.5)/1000.0;,printf,(x=%f,y=%fn,x,y);,。
