目录
8.1 自动类型转换
8.1.1 转换规则
数据类型的自动转换按照以下规则进行:
(1)若参与运算量的类型不同,则先转换成同一类型,然后再进行运算。
(2)转换按数据长度增加的方向进行,以保证精度不降低。
(3)所有的实数运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
(4)char型和short型参与运算时,先转换成int型。
(5)在赋值运算中,赋值号两侧量的数据类型不同时,赋值号右侧量的类型将转换为左侧变量的类型,当右侧量的数据类型长度比左侧变量的数据类型长度大时,会降低精度。
数据类型自动转换示意图如下:
图中横向箭头表示必定的转换:char型、short型在运算时一律先转换为int型;float型数据在运算时一律先转换成double型,以提高运算精度。
纵向的箭头表示当运算对象为不同数据类型时转换的方向。注意箭头方向只表示数据类型级别的高低,由低向高转换,并非逐级转换。
8.1.2 示例程序
自动类型转换示例程序:
#include <stdio.h>
int main()
{
float a,b;
float pi=3.1416;
int s, r=4;
a=5/2-4/3;
b=3.0/2+5/3.0;
s=pi*r*r;
printf("s = %d\n",s);
printf("a = %f, b = %f\n",a,b);
return 0;
}
代码分析:①整数除整数结果为整数,所以5/2-4/3的整数结果赋给浮点变量a,以浮点小数形式存储。②浮点数和整数的运算结果为浮点数,所以3.0/2+5/3.0的浮点小数结果赋给浮点型变量b,以浮点小数形式存储。③pi为实型,s、r为整型。在执行s=pi*r*r语句时,pi和r都转换成double型计算,结果也为double型。但由于最终结果要赋给整型变量s,故将double型的结果舍去了小数部分,赋给整型变量s。
运行结果:
s = 50
a = 1.000000, b = 3.166667
8.2 强制类型转换
可以通过强制类型转换运算符来将一个表达式转换成所需要的类型。一般形式为:(类型说明符)表达式
作用是把表达式的运算结果强制转换成类型说明符所表示的类型。例如:(int)7.4%3表示先把7.4转化成整数7,再对3取余。(int)2.3*12是把2.3转换成整型再与12相乘。
关于数据类型转换还应注意:
(1)进行强制类型转换时,“类型说明符”和“表达式”须以括号限定(“表达式”为单个变量或常数值时,其括号可以省略),否则类型转换仅在局部进行。
(2)无论是强制类型转换还是自动类型转换,都只是为了本次运算的需要而进行的临时性转换,相关变量的数据类型不会被改变。