3.2 运算中的数据类型转换
在基本表达式和复杂表达式中,如果参加运算的两个数据类型不一致,要先进行数据类型转换,再进行计算。或者某些运算符需要将参加运算的数据先转换为所需的类型,才可参加运算。本节介绍数据类型转换的方法。
3.2.1 强制类型转换
强制类型转换又称为显式类型转换,显式地将表达式的类型转换为所需类型。强制类型转换有两种形式,一种是C语言新增的函数表达式的形式:
(类型名) (表达式)
其中表达式一般为基本表达式和复杂表达式。
另一种是C语言中采用已久的类型转换形式:
(类型名) 表达式
其中表达式一般为简单的表达式。
两种形式的转换在基本数据类型相同时具有相同的结果。
强制类型转换的作用就是将表达式的类型转换为类型名指定的数据类型。例如下面的程序段:
float x=5.9; int k=int(x)+(int)x; /*将实型变量x转换成整型,运算后存到变量k中*/ (int)x+x; /*将第一个实型变量x转换成整型,转换完成后,变量x依然为实型变量*/ (int)(x+x); /*将实型表达式x+x转换成整型*/ (int)6.5%4; /*将常量6.5取整后参加取模运算*/
在进行强制转换时要注意以下三个方面:
◆ 进行强制类型转换时,表达式要用括号括起来,以防止出现错误。例如,设x=3.2,y=2.5,则表达式(int)(x+y)表示将x+y的值5.7取整,即值为5;而对于表达式(int)x+y,则表示先对x取整后,再加实型变量y的值,表达式的值为实型,其值为5.5,上例也有说明。
◆ 强制类型转换是将所需变量或表达式的值转换为所需类型,但并不改变原来变量和表达式的类型属性,也就是说原来变量或表达式的类型未发生任何变化。
◆ 强制类型转换运算符要用圆括号括起来,而变量定义时类型名直接书写,在使用时易发生混淆,应特别注意。
代码3.1说明了强制类型转换的结果。
代码3.1 强制类型转换:fiIe1.c
#include "stdio.h" main() { int m,n; float x,y; x=2.5; y=4.7; /*变量赋初值*/ m=(int)(x+y); /*强制把浮点型转换为整型*/ n=(int)x+m/3; /*变量x强制转换成整型*/ m=n%4; /*整型数据的取余运算*/ x=x+y; printf("m=%d,n=%d,x=%f,y=%f\n",m,n,x,y); }
程序的运行结果为:
m=0,n=4,x=7.200000,y=4.700000
从以上程序可以看出,发生强制类型转换时并不改变原来的变量和表达式的类型属性,例如变量x的实型属性,最后没有发生任何变化。
3.2.2 隐含类型转换
整型、单精度型、双精度型的不同数值类型可以进行混合运算。因为字符型数值可以看作整型,所以整型、实型(包括单精度型与双精度型)及字符型之间可进行混合运算。这样一来,字符型数也纳入了数值运算体系之中。但是在运算时,不同类型数值必须转换为同一类型数值。其转换规律是:自动转换(由系统自动进行,无须干预)、就高不就低(把低级类型转换为高级类型,再进行运算)。
隐含转换是按照运算表达式的优先级别分步进行的,优先级高的优先完成转换;在同一级别表达式中,操作数先直接转换为数据类型保值精度更强的形式。其目的是产生一个公共的类型,它也是双目运算表达式结果的类型。类型转换的原则如图3.1所示。
图3.1 隐含转换的转换原则
各种算术类型数据的顺序在混合类型的表达式中,隐含转换是自动将数据向较高级别类型转换的过程(按照箭头所标明的位置进行转换)。双目运算中,低类型的数据直接转换为高类型的数据,其中无符号整数的类型高于有符号的整数类型。int数据类型之下的运算转换为int类型处理。如char和short类型的运算都转换为int数据类型;Iong型数据与doubIe型数据运算,先将Iong型数据转换为doubIe型,结果为doubIe型;一个fIoat型数据与一个浮点型的默认运算是doubIe类型,这意味着两个fIoat数的运算可优先转换为doubIe类型,结果的类型也可以是fIoat类型。