1、数据的类型转换Teacher teaching designCONTENTS 目 录自动类型转换强制转换案例剖析 交流提升案例分析 仿真演练自动类型转换PART 01自动类型转换数据类型的转换方法:变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转换。自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则:一、自动类型转换(1)、自动转换的原则不同类型的数据可以进行混合运算,但是还要遵循一个原则:一个运算符两侧的操作数的数据类型不同,则系统按“先转换、后运算”的原则。混合运算的自动转换规则如图所示。double float 高级longuns
2、ignedint char short 低级(2)、转换过程中注意点说明:、当同一表达式中各数据的类型不同时,编译程序会自动把它们转变成同一类型后再进行计算。转换优先级按上图箭头所示:char/shorintunsignedlongfloatdouble即左边级别低的类型向右边转换。具体地说,若在表达式中优先级最高的数据是double型,则此表达式中其他数据均转换成double 型,且结果也是double型;自动类型转换、赋值过程中类型转换:C语言赋予了赋值表达式类型转换功能,一旦出现变量和表达式类型不一致时,会自动进行类型转换,将表达式的值向变量类型方向进行转换。类型转换有前提必须是相近的且
3、可以转换的才能进行,主要包括如下表中几种情况:如,设x 是整型数,y是单精度实型数,z是双精度实型数,则:x+a 的值是整型数;x+1.5的值是双精度实型数;x+y的值是双精度实型数;x+y+z+x的值 是双精度实型数;a+a的值是整型数;y+y的值也是双精度实型数。变量类型变量类型表达式类型表达式类型转换方式转换方式整型整型实型实型截取小数部分截取小数部分实型实型整型整型小数部分补小数部分补0 0单精度实型单精度实型双精度型实型双精度型实型截取小数部分剩截取小数部分剩7 7位有效数字位有效数字双精度实型双精度实型单精度实型单精度实型小数部分补小数部分补0 0到到1616位位字符型字符型整型整
4、型低低8 8位送至字符变量一个字节的存储单元位送至字符变量一个字节的存储单元整型整型字符型字符型ASCASC码送至整型变量低码送至整型变量低8 8位位,若是带符号且若是带符号且ASCASC码码最高位为最高位为1,1,则补则补1,1,否则补否则补0.0.强制转换PART 02强制转换强制转换(1)强制转换的表示形式是:(类型说明符)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。强制类型转换符的对象是表达式,包括常量,变量,函数和表达式,把圆括号括起来的类型名称放置在预转换的表达式前面。例如:(float)x 把x转换为实型 (int)(a-b)把a-b的结果转换为整型 (int)a
5、-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.34
6、56;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型的中间量,其数据类型并未转换
7、成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.340000b是int型,a是float类型并不改变。3、无论是强制转换或是自动转换,如果要转换的量超过了转换后类型
8、的表示范围,将出现溢出错误或不可预料的结果。如: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);
9、printf(%dn,b-a);A)3,1 B)50,2 C)2,2 D)2,50 思考题:字符型数据与整型数据之间的转换方法?3、下列程序执行后的输出结果是 A)G B)H C)I D)Jmain()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)double5、已知大写字母A的A
10、SCII码值是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)y8、以下程序的运行结果为:()main()float x=1.6546,y;y=(int)(x*1000+0.5)/1000.0;printf(x=%f,y=%fn,x,y);
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。