4.8.1 自动转换
自动转换发生在不同数据类型的混合运算中,由编译系统自动完成。自动转换需要遵循如下5条原则。
❑ 若参与运算的变量类型不同,则先转换成同一类型,然后再进行运算。
❑ 按数据长度增加的方向进行转换,以保证精度不降低。如整型和长整型进行运算时,先把整型量转成长整型后再进行运算。
❑ 所有的浮点运算都是以双精度进行的,即使仅含单精度运算的表达式,也要先转换成双精度型,再进行运算。
❑ 字符型和短型变量参与运算时,必须先转换成整型。
❑ 在赋值运算中,当赋值号两边的数据类型不同时,赋值号右边的类型将转换为左边的类型。如果右边的数据类型长于左边,则将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入进行舍入。
上述转换原则的具体描述如图4-8所示。
图4-8 变量转换原则
在图4-8中,横向箭头是运算时必须要进行的转换。例如字符型必须转换为整型才可以运算,单精度型必须转换为双精度型才能运算。纵向箭头表示当运算对象的类型不同时的转换方向,例如字符型和单精度型进行运算时,应将字符型转为双精度型后运算。
需要注意的是,字符型转为双精度型的过程是一次性的,不需要中间过程,其他转换同样。不同类型的数据只有转换为图4-8所示的相交节点时才能进行运算。看下面的一段代码。
#include <stdio.h> int main(void) { float PI=3.14159; int s, r=5; s=r*r*PI; printf("s=%d\n", s); }
在上述代码中,PI为实型,s和r为整型。在执行面积计算语句“s=r*r*PI”时,r和PI都转换成双精度型然后计算,结果也为双精度型。但由于s为整型,故赋值结果仍为整型,它舍去了小数部分。
再看下面的代码。
m*n+'b'+23-d/e
在上述运算中,需要将m转换为整型,n转换为单精度型,b和d转换为双精度型,e转换为长型。
因为C语言和其他语言一样,都是从左向右扫描运算式的,所以上述运算的具体步骤如下所示。
第1步:计算m×n,整型和单精度型转换为双精度型,先将m、n转换为双精度型,再计算,结果为双精度型。
第2步:'b’为字符,转换为双精度型后与第1步结果进行相加,结果为双精度型。
第3步:23为整型,转为双精度型后运算,结果为双精度型。
第4步:“/”运算的优先级高于“-”运算,所以先计算d/e,e转换为双精度型后运算,结果为双精度型。
请看下面的实例:计算圆的大概面积和精确面积的过程。
实例4-7
计算圆的大概面积和精确面积
源码路径daima\4\4-7
本实例的实现文件为“zidong.c”,具体代码如下。
int main(void){ float PI = 3.14159; int s1, r = 5; double s2; s1 = r*r*PI; s2 = r*r*PI; printf("圆的大概面积是%d, 精确面积是 %f \n", s1, s2); }
代码编写完毕后,执行效果如图4-9所示。
图4-9 执行效果
拓展范例及视频二维码
范例4-7-01:变量内存地址的理解
源码路径:演练范例\4-7-01\
范例4-7-02:使用转义序列字符
源码路径:演练范例\4-7-02\