C语言类型转换(强制类型转换和自动类型转换)
在计算过程中,如果遇到不同的数据类型参与运算,是终止程序,还是转换类型后继续计算?编译器采取第2种方式,能够转换成功的继续运算,转换失败时程序再报错终止运行。C语言数据类型转换方式有两种,分别是:
数据类型转换如下图所示:
图中标示的是编译器默认的转换顺序,比如有 char 类型和 int 类型混合运算,则 char 类型自动转换为 int 后再进行运算;又比如有 int 型、float 型、double 型混合运算,则 int 和 float 自动转换为 double 类型后再进行运算。
例如:
例如:
上述情况都是由低精度类型向高精度类型转换。如果逆向转换,可能会出现丢失数据的危险,编译器会以警告的形式给出提示。
例如:
42
题目转换后得到以下结果:i=1+6.0+1.234+99-65=1.0+6.0+1.234+99.0-65.0。和自动转换为整数赋值给 i。
显式转换格式如下:
继续分析上例,我们只是把 f 小数位直接舍弃,输出了整数部分,变量 f 的值没有改变,依然是 1.23,可以再次输出结果查看。
再看下面的例子,分析结果是否相同:
f1=4.4,f2=4.0
显然结果是不同的,原因是 f1 只对 1.2 取整,相当于 f1=1+3.4;而 f2 是对 1.2 和 3.4 的和 4.6 取整,相当于 f2=(int)4.6。
不同进制数据输出字符'a'
97,0141,0x61
隐式数据类型转换99.500000
隐式数据类型转换99
显式数据类型转换4.900000
显式数据类型转换5.000000
声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
- 自动类型转换
- 强制类型转换
C语言自动类型转换
自动类型转换也叫隠式类型转换。C语言中设定了不同数据参与运算时的转换规则,编译器会自动地进行数据类型的转换,进而计算出最终结果,这就是自动转换。数据类型转换如下图所示:

图中标示的是编译器默认的转换顺序,比如有 char 类型和 int 类型混合运算,则 char 类型自动转换为 int 后再进行运算;又比如有 int 型、float 型、double 型混合运算,则 int 和 float 自动转换为 double 类型后再进行运算。
例如:
int i;
i = 2 + 'A';
例如:
double d;
d = 2 + 'A' + 1.5F;
上述情况都是由低精度类型向高精度类型转换。如果逆向转换,可能会出现丢失数据的危险,编译器会以警告的形式给出提示。
例如:
int i;
i = 1.2;
提示:把浮点数转换为整数,则直接舍弃小数位。
实例:整型和浮点型数据类型间的隐式转换。#include <stdio.h> int main(void) { int i; i=1+2.0*3+1.234+'c'-'A'; /*混合运算*/ printf("%d\n",i); /*输出i*/ return 0; }运行结果:
42
题目转换后得到以下结果:i=1+6.0+1.234+99-65=1.0+6.0+1.234+99.0-65.0。和自动转换为整数赋值给 i。
C语言强制类型转换
强制类型转换也叫显式类型转换。隐式类型转换编译器是会产生警告的,提示程序存在潜在的隐患。如果非常明确地希望转换数据类型,就需要用到显式类型转换。显式转换格式如下:
(类型名称) 变量或者常量;
或者:(类型名称) (表达式);
例如,我们需要把一个浮点数以整数的形式使用 printf() 函数输出,怎么办?可以调用显示类型转换,代码如下:
float f=1.23;
printf("%d\n",(int)f);
继续分析上例,我们只是把 f 小数位直接舍弃,输出了整数部分,变量 f 的值没有改变,依然是 1.23,可以再次输出结果查看。
printf("%f\n", f);
输出结果是 1.230000。再看下面的例子,分析结果是否相同:
float f1,f2; f1=(int)1.2+3.4; f2=(int)(1.2+3.4); printf("f1=%f,f2=%f",f1,f2);输出结果:
f1=4.4,f2=4.0
显然结果是不同的,原因是 f1 只对 1.2 取整,相当于 f1=1+3.4;而 f2 是对 1.2 和 3.4 的和 4.6 取整,相当于 f2=(int)4.6。
综合示例
下面是一个综合应用数据类型和类型转换知识的例子:#include <stdio.h> int main(void) { int i; double d; char c='a'; printf("不同进制数据输出字符\'a\'\n"); printf("%u,0%o,0x%x\n",c,c,c); /*十进制、八进制、十六进制*/ i=2; d=2+c+0.5F; /*隐式转换*/ printf("隐式数据类型转换%f\n",d); i=d; /*隐式转换,舍弃小数位*/ printf("隐式数据类型转换%d\n",i); d=(int)1.2+3.9; /*显式转换,1.2取整*/ printf("显式数据类型转换%f\n",d); d=(int)(1.2+3.9); /*显式转换,和取整*/ printf("显式数据类型转换%f\n",d); return 0; }运行结果:
不同进制数据输出字符'a'
97,0141,0x61
隐式数据类型转换99.500000
隐式数据类型转换99
显式数据类型转换4.900000
显式数据类型转换5.000000
声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。