
3.8 数据类型的转换
变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,另一种是强制转换。
1.自动转换
自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则:若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
转换按数据长度增加的方向进行,以保证精度不降低。具体转换规则如下:
● char型和short型或short型和short型参与运算时,先转换成int型,结果为int型。
● int型和long型运算时,先把int量转成long型再进行运算,结果为long型。
● float型与float单精度型运算,结果为float单精度型。
● float型与long型运算,结果为float单精度型。
● float型与double型或其他类型与double型运算,要先转换成double型,结果为double型。注意:如1.2这样的实数常量是作为double型参与运算的。
● 在赋值运算中,赋值号两边的量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入或直接舍去等方式进行处理。
图3-7表示了类型自动转换的层次关系。

图3-7 类型自动转换的层次关系
可以通过如下语句中的sizeof()运算来显示运算后的表达式的字节数,再判断是否发生了类型自动转化。

表达式字节数为4,说明是整型与单精度浮点型的运算,结果为单精度浮点型。

表达式字节数为8,说明是单精度型与双精度型(1.0带小数常量系统作为双精度类型)的运算,结果为双精度型。
【例3-16】不同类型间的自动转换。

运行结果:
本例程序中,pi为实型;s,r为整型。在执行s=r*r*pi语句时,r转换成float型计算,结果也为float型。但由于s为整型,故赋值结果仍为整型,舍去了小数部分。
2.强制类型转换
强制类型转换是通过类型转换运算来实现的。其一般形式为

其功能是把表达式的运算结果强制转换成类型说明符所表示的类型,举例如下。

在使用强制转换时应注意以下问题:
1)类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加。
2)无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,并不改变数据说明时对该变量定义的类型。
【例3-17】强制类型转换示例。

运行结果:
说明:本例表明,f虽强制转为int型,但只在运算中起作用,是临时的,而f本身的类型并不改变。因此,(int)f的值为5(删去了小数),而f的值仍为5.75。