![C编程从入门到实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/721/30210721/b_30210721.jpg)
4.8.1 自动转换
自动转换发生在不同数据类型的混合运算中,由编译系统自动完成。自动转换需要遵循如下5条原则。
❑ 若参与运算的变量类型不同,则先转换成同一类型,然后再进行运算。
❑ 按数据长度增加的方向进行转换,以保证精度不降低。如整型和长整型进行运算时,先把整型量转成长整型后再进行运算。
❑ 所有的浮点运算都是以双精度进行的,即使仅含单精度运算的表达式,也要先转换成双精度型,再进行运算。
❑ 字符型和短型变量参与运算时,必须先转换成整型。
❑ 在赋值运算中,当赋值号两边的数据类型不同时,赋值号右边的类型将转换为左边的类型。如果右边的数据类型长于左边,则将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入进行舍入。
上述转换原则的具体描述如图4-8所示。
![](https://epubservercos.yuewen.com/60FE48/16568261605808006/epubprivate/OEBPS/Images/figure_0065_0001.jpg?sign=1739139270-polvhqvgij7e8UqXrTs7X9RgSMbzdPz7-0-67c1d79a69c3e3546b0d308d4133fcbd)
图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所示。
![](https://epubservercos.yuewen.com/60FE48/16568261605808006/epubprivate/OEBPS/Images/figure_0066_0001.jpg?sign=1739139270-AY41tjMdPRjkLGBNZ0hWXnfOw1IG2das-0-92ff913e0be179e4a4c10470002a7f26)
图4-9 执行效果
拓展范例及视频二维码
范例4-7-01:变量内存地址的理解
源码路径:演练范例\4-7-01\
![](https://epubservercos.yuewen.com/60FE48/16568261605808006/epubprivate/OEBPS/Images/figure_0066_0002.jpg?sign=1739139270-EwfZhSIUzbMeULxqXRi4fwU3IPLFHnHS-0-6bdeb31e158607fecbcc1e2e26745b1a)
范例4-7-02:使用转义序列字符
源码路径:演练范例\4-7-02\
![](https://epubservercos.yuewen.com/60FE48/16568261605808006/epubprivate/OEBPS/Images/figure_0066_0003.jpg?sign=1739139270-g22Ff8tD4Blve5C3wUBnP7QkhEX2ypoG-0-e7a2b2b4946c96885847d43c7dcf3e48)