10.10 类型转换
类型转换在C语言中是一个容易被人忽视的概念,却频繁地出现在程序的表达式中,所以C语言编程人员都应该掌握类型转换。类型转换可分为隐式转换和显式转换,接下来分别介绍这两种转换方式。
1.隐式转换
隐式转换又称为自动转换,这种转换会在计算时自动将表达式中的常量和变量转换成正确的类型,以确保计算结果的正确,而转换的方式则遵循由低类型向高类型的转换。我们可以通过图10-1来了解隐式转换过程。
图 10-1 隐式转换
为了让读者深入理解隐式转换,看看以下两段代码及其运行结果。第一段:
include<stdio.h>
int main()
{
unsigned short i=0;
unsigned short n=0;
while(i<n-1)
{
printf("进入while循环\n");
break;
}
return 0;
}
因为运行时没有任何输出,所以可以推断并没有进入while循环。
第二段:
include<stdio.h>
int main()
{
unsigned short i=0;
unsigned long n=0;
while(i<n-1)
{
printf("进入while循环\n");
break;
}
return 0;
}
运行结果:
进入while循环
对比以上两段代码,为什么第二段代码能够进入while循环,而第一段代码却不能呢?具体分析如下。
在第一段代码中,由于定义的i和n都是无符号短整型,因此在执行i<n-1时,n-1中的n为无符号短整型,而数字常量1为有符号整型,类型不匹配,会导致隐式类型转换。由于n的值为0,因此发生隐式转换后的值还是0,执行n-1之后的值为有符号整数-1,此时while循环中的条件为0<-1,显然不成立,当然不会进入while循环。
在第二段代码中,定义的i同样为短整型,而n却为长整型,所以在执行i<n-1时,同样会因为n和1的类型不匹配而发生隐式类型转换。由图10-1可知,转换方式为将1转换为无符号长整型,转换后的结果仍然为1,所以接下来执行n-1时得到的就是无符号长整型0xffffffff,此时while循环中的条件为0<0xffffffff,显然成立,此时能够进入while循环。
分析上面的隐式转换,当表达式中出现多种类型时要格外注意,以免出现结果与期望的不符,所以建议在混有多种类型的表达式中采用显式转换。
2.显式转换
显式转换又称为强制转换,其一般格式为:
(类型说明符)(表达式);
强制转换是将表达式的结果转换为类型说明符所表示的类型,当然这里所指的表达式也可以是变量或常量。下面就来看显式转换的常用方法。
x=(int)23.49;
最终结果为23,从这里可以看出,将浮点数转换为整数时小数部分将被截除掉。
c=(int)a+b;
c=(int)(a+b);
看看上面两行代码,第一行代码表示将a先转换为整型再与b相加,而第二行代码表示先将a与b相加,再将最终的结果转换为整型。
int a=(double)6/5;
在这一行代码中,先通过强制转换将6转换为双精度型,由于5是整型,因此在计算时会将其隐式转换为双精度型,计算结果为1.2。由于等号的左边是整型,因此又会对结果1.2隐式转换为整型,小数部分被截除掉,这样最终结果为a等于1。