知识讲解
隐式类型转换
隐式类型转换是指编译器自动进行的类型转换。隐式类型转换可分为3种:算术转换、赋值转换和输出转换。
(1)算术转换
在进行算术运算(加、减、乘、除、取模和符号运算)时,不同类型的数据必须转换成同一类型的数据才能进行运算。转换规则是以表达式中占内存最大的类型为准,将其他类型的数据都转换为该类型。例如,表达式中占内存最大的类型为 int,则将其他类型的数据都转换为int类型;表达式中占内存最大的类型为double,则将其他类型的数据都转换为double类型。
如果表达式中有多个占内存大小相同的数据类型,则转换规则如下。
① 如果表达式中存在int类型与float类型占用的内存大小相同且最大,则以float类型为准,将其他类型数据都转换为float类型。
② 如果表达式中存在long类型与float类型占用的内存大小相同且最大,则以float类型为准,将其他类型数据都转换为float类型。
③ 如果表达式中存在int类型与long类型占用的内存大小相同且最大,则以long类型为准,将其他类型数据都转换为long类型。
(2)赋值转换
赋值时,若变量的数据类型与赋值的数据类型不同,编译器会将“=”右边的值先转换为对应变量的数据类型,再将值赋给变量,例如将一个浮点数赋值给int类型的变量,代码如下。
int a = 10.2;
上述代码将浮点数10.2赋给int类型的变量a,编译器在赋值时会将10.2转换为int类型的10,然后再将10赋给a,a的最终结果为10。这种在赋值时发生的类型转换称为赋值转换,是一种隐式类型转换。
需要注意的是,将浮点数赋给整型变量,在进行类型转换时会直接将小数点和小数位省略,不存在四舍五入。正因如此,将精度较大的类型的数据转换为精度较小的类型的数据时,会造成数据精度损失,所以最好不要将精度较大的类型的数据赋给精度较小的类型的变量。
(3)输出转换
在程序中将数据用printf()函数以指定格式输出时,当要输出的数据类型与输出格式不符时,编译器会自动进行类型转换,如将一个int类型数据用char类型格式(%c)输出,相当于将int类型数据转换成char类型数据输出;将一个char类型数据用int(%d)类型格式输出,相当于将char类型数据转换成int类型数据输出。
将取值范围较大类型的数据转换为取值范围较小类型的数据时,其值不能超出较小取值范围类型数据允许的取值范围,否则转换时会出错。示例代码如下。
int a = 321; printf("%c", a);
上述代码的运行结果为A,因为char类型允许的最大值为255,321大于此值,所以结果取以256为模的余数,即进行取余运算(321%256=65),而65正是字符“A”对应的ASCII值。
输出转换有一定的局限性。它常用于int类型与char类型数据的转换,而用于其他类型数据的转换时常常会发生错误,示例代码如下。
int d = 9; printf("%f", d); float c = 3.2; printf("%d", c);