C语言规定,不同类型的数据进行运算时要先转换成相同类型的数据才能进行运算
数据类型转换就是将数据(变量、数值、表达式的结果等)从一种类型转换为另一种类型
数据类型的各种转换只影响表达式的运算结果,并不改变原变量的定义类型,并且其数据值也不会发生任何改变
自动类型转换
自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换
这种转换不需要程序员干预,会由C语言编译系统自动完成
转换规则是:
把占用内存空间少的(低级)类型向占用空间多的(高级)类型转换,以保证运算的精度
- 图中的纵向箭头表示必定的转换
- 图中的横向箭头表示当经过纵向的转换后,进行运算的数据类型仍然不同时进行的转换方式
例:若有定义“double d=153;int i=10;float f=3.8;”,则表达式d+’a’+i*d/f的值的类型是___。
分析:
- 将int型变量i和float型变量f转换为double型后,进行i*d/f的运算,结果为double型。
- 将char型常量’a’转换为int型,进行d+’a’的计算,此时“+”左右两边数据的类型不同,则再将int型转换为double型,进行加法运算,结果为double型。
- 将(1)的结果和(2)的结果进行加法计算,最终结果为double型
自动类型转换示例
1 #include2 int main() 3 { 4 float PI = 3.14159; 5 int s1, r = 5; 6 double s2; 7 s1 = r * r * PI; 8 s2 = r * r * PI; 9 printf("s1=%d, s2=%fn", s1, s2); 10 return 0; 11 }
运行结果:s1=78, s2=78.539749
分析:
- 在计算表达式rrPI时,r 和 PI 都被转换成 double 类型,表达式的结果也是 double 类型
- 但由于 s1 为整型,所以赋值运算的结果仍为整型,舍去了小数部分,导致数据失真
强制类型转换
采用强制类型转换运算符将某种数据类型强制转换成指定的数据类型
其一般形式为:
(类型说明符)(表达式)
例如:
1 (float) a; 2 (int)(x+y); 3 (float) 100;
例:强制类型转换示例
1 #include2 int main() 3 { 4 int a=3,b=4; 5 float c; 6 c=(float)(a+b)/2; 7 printf("c=%fn",c); 8 return 0; 9 }
运行结果:c=3.500000
TIPS:
需强制类型转换中的表达式一定要括起来,否则只对紧随括号后的量进行类型转换
强制类型转换是一种不安全的转换,如果是从高级类型转换成低级类型,则会损失数据的精度
类型转换只是临时性的
无论是自动类型转换还是强制类型转换,都只是为了本次运算而进行的临时性转换
转换的结果也会保存到临时的内存空间,不会改变数据本来的类型或者值
例如:
1 #include2 int main(){ 3 double total = 400.8; 4 int count = 5; 5 double unit; 6 int total_int = (int)total; 7 unit = total / count; 8 printf("total=%lf, total_int=%d, unit=%lfn", total, total_int, unit); 9 return 0; 10 }
运行结果:
total=400.800000, total_int=400, unit=80.160000
分析:
- 第 6 行代码,total 变量被转换成了 int 类型才赋值给 total_int 变量
- 而这种转换并未影响 total 变量本身的类型和值
- 如果 total 的值变了,那么 total 的输出结果将变为 400.000000
- 如果 total 的类型变了,那么 unit 的输出结果将变为 80.000000



