一、表达式中的自动类型转换
在进行整数除法和浮点数除法时,我们已经接触到了表达式中的自动转换问题。在C语言中,相同类型的操作数进行运算的结果的类型与其操作数的类型相同。
1.类型提升:C编译器在对操作数进行运算之前将所有操作数都转换成取值范围较大的操作数类型,称为类型提升。
2.类型提升的规则:
纵向箭头表示必然的转换,即将所有的char和short提升为int,这一步称为整数提升。float 类型在运算中一律转化为double型以提升精度。
横向箭头表示不同类型的操作数进行混合运算时由低到高的类型转换方向,但不代表转换的中间过程。
例如:一个int 型操作数与一个float型操作数进行算术运算,则在对其进行算术运算之前要先将float 型操作数自动转换为double 型,并将int型操作数转换成double型。
一个特例是:如果一个操作数是long型,另一个是unsigned型,同时unsigned型操作数的值又不能用long型表示,则两个操作数都转换成unsigned long型。
二、赋值中的自动类型转换
1、在一个赋值语句中,若赋值运算符左侧变量的类型和右侧表达式的类型不一致,则赋值时将发生自动类型转换。
2、规则:右侧表达式的值转换成左侧变量的类型。
3、注意:
自动类型转换是一把双刃剑,坏处就在于可能会发生数据信息丢失、类型溢出等错误。
例如:将pow函数的运算结果强行转换为long,不仅会丢失其小数位信息,而且还会在pow函数的运算结果超出long的表数范围时发生数值溢出的错误。
一般而言,将范围小变大是安全的。
三、强制类型转换(Casting)运算符
1、主要作用:将表达式值的类型强制转换为用户指定的类型。
2、采用方式:(类型)表达式
#include<stdio.h>
int main(void)
{
int m=5;
printf("m/2=%d\n",m/2);
printf("(float)(m/2)=%f\n",(float)(m/2));
printf("(float)m/2=%f\n",(float)m/2);
printf("m=%d\n",m);
return 0;
}
运行结果自行查看。