自动转换遵循以下规则:
1)若参与运算的类型不同,则先转换成统一类型,然后进行运算。
2)转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int型转换成long型后再进行运算。
a.若两种类型的字节数不同,转换字节数高的类型
b.若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型
3)所有的浮点运算都是以双精度进行的,即使仅含float单精度运算的表达式,也要先转换成double型,再运算。
4)char型和shor型参与运算时,必须先转换成int型。
5)在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边的类型转换成右边的类型。如果右边量的数据类型长度大于左边时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入计算。
隐式类型转换分三种,算术转换、赋值转换和输出转换。
1.算术类型运算(加、减、乘、除、取余以及符号运算)时,不同类型数据必须转换成同一类型的数据才能运算,算术转换原则为:在进行运算时,以表达式中最长类型为主,其它类型均转换成该类型,如:
(1)若运算数中有double型或float型,则其它类型数据均转换成double类型进行运算。
(2)若运算数中最长的类型为long型,则其它类型均转换成long型。
(3)若运算数中最长类型为int型,则char型也转换成int型进行运算。算术转换是在运算过程中自动完成的。
2.赋值转换
进行赋值操作时,赋值运算符右边的数据类型必须转换成赋值号左边的类型,若右边的数据类型的长度大于左边,则要进行截断或舍入操作。如下:
char ch = 4;
int i = 2;
int result = 0;
float f = 4.0;
double d = 2.0;
result = ch / i + (f * d - i);
(1)先计算ch/i,ch->int型,ch/i->int型。
(2)接着计算f*d-i,由于最长类型为double型,故f->double型,i->double型,f*d-i->double型。
(3)(ch/i)和(f*d-i)进行加运算,由于f*d-i为double型,故ch/i->double型,ch/i+(f*d-i)->double型。
(4)由于result为int型,故ch/i+(f*d-i)->int,即进行截断与舍入,最后取值为整型。
3.输出转换
在程序中将数据用printf函数以指定格式输出时,当要输出的数据类型与输出格式不符时,便自动进行类型转换,如一个long型数据用整型格式(%d)输出时,则相当于将long型转换成整型(int)数据输出;一个字符(char)型数据用整型格式输出时,相当于将char类型转换成int型输出。注意:较长类型数据转换成短型数据输出时,其值不能超过短型数据允许的值范围,否则转换时将出错。