首页 > 编程笔记

C语言类型转换(强制类型转换和自动类型转换)

在计算过程中,如果遇到不同的数据类型参与运算,是终止程序,还是转换类型后继续计算?编译器采取第2种方式,能够转换成功的继续运算,转换失败时程序再报错终止运行。C语言数据类型转换方式有两种,分别是:

C语言自动类型转换

自动类型转换也叫隠式类型转换。C语言中设定了不同数据参与运算时的转换规则,编译器会自动地进行数据类型的转换,进而计算出最终结果,这就是自动转换。

数据类型转换如下图所示:
C语言自动类型转换示意图

图中标示的是编译器默认的转换顺序,比如有 char 类型和 int 类型混合运算,则 char 类型自动转换为 int 后再进行运算;又比如有 int 型、float 型、double 型混合运算,则 int 和 float 自动转换为 double 类型后再进行运算。

例如:

int i;
i = 2 + 'A';

先计算“=”号右边的表达式,字符型和整型混合运算,按照数据类型转换先后顺序,把字符型转换为 int 类型 65,然后求和得 67,最后把 67 赋值给变量i。

例如:

double d;
d = 2 + 'A' + 1.5F;

先计算“=”号右边的表达式,字符型、整型和单精度 float 类型混合运算,因为有浮点型参与运算,“=”右边表达式的结果是 float 类型。按照数据类型转换顺序,把字符型转换为 double 类型 65.0,2 转换为 2.0,1.5F 转换为 1.5,最后把双精度浮点数 68.5 赋值给变量 d。

上述情况都是由低精度类型向高精度类型转换。如果逆向转换,可能会出现丢失数据的危险,编译器会以警告的形式给出提示。

例如:

int i;
i = 1.2;

浮点数 1.2 舍弃小数位后,把整数部分 1 赋值给变量 i。如果 i=1.9,运算后变量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);

可以得到输出结果 1,没有因为调用的 printf() 函数格式控制列表和输出列表前后类型不统一导致程序报错。

继续分析上例,我们只是把 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

优秀文章