C语言是强类型语言,变量的数据类型被指定后,会一直保持该数据类型。同时C语言对参与赋值运算和算术运算的操作数数据类型要求必须一致,当参与运算的操作数数据类型不一致时,就需要对操作数的数据类型进行类型转换,把参与运算的操作数转换为同一数据类型后,再进行运算。
一、隐式类型转换
例如:
double PI = 3.14;
int radius = 5;
double s;
s = PI * PI * radius;
在上面的例句中,表达式PI * PI * radius有二个操作数,PI是double类型,radius是整数类型。因为操作数的数据类型不一致,C语言编译器会对数据类型做强制转换,将radius的整数类型强制转换为double类型。
这种转换是C编译器自动进行的,开发者不需要进行任何操作,由C编译器自动完成,这种类型的转换也称为隐式转换。
由于不同的数据类型存储空间和表示的数值精度是不同的,因此在数据类型的转换过程中,就会存在数值精度丢失和数值溢出的问题。例如:double类型转换为float类型,数值精度就会丢失;long类型转换为int类型时,如果long类型变量存储的数值超过了int类型能够存储的数值范围,就会发生数值溢出。
为了避免在转换过程中发生数值精度丢失和溢出的问题,隐式转换都会遵循从低级数据类型到高级类型的转换规则,也可以说是从数值存储精度小的类型到存储数值精度高的类型转换。这些数据类型按数值存储范围大小依次为:
short->int->long->float->double
表1 列出了数据类型隐式转换的一般规则。
表 1 数据类型隐式转换的一般规则
|
操作数1的数据类型 |
操作数2的数据类型 |
转换后的数据类型 |
|
short\char |
int |
int |
|
short\char\int |
long |
long |
|
short\char\int\long |
float |
float |
|
short\char\int\long\double |
double |
double |
【例1】类型的隐式转换练习
程序清单 sample.c
#include <stdio.h>
int main()
{
// 声明char类型的变量
char chTemp = 65;
// 声明int类型的变量
int nTemp = 34;
// 声明float类型的变量
float fTemp = 29.6f;
// 声明double类型的变量
double dTemp = 86.69;
printf("char类型的数据与float类型的进行相加运算,运算结果为:%.2f\n",(chTemp+fTemp));
printf("float类型的数据与double类型的进行相加运算,运算结果为:%.2f\n",(fTemp+dTemp));
printf("char类型的数据与int类型的进行相加运算,运算结果为:%d\n",(chTemp+nTemp));
}
二、显示类型转换
显示类型转换是相对隐式转换来说的,隐式转换由C编译器自动进行,不需要开发者做任何操作。显示类型转换需要开发者在代码中对数据类型进行显示类型转换。
当进行数据类型的显示转换时,程序员需要自身判断类型转换过程中是否会发生数值溢出或精度丢失,当由精度高的类型转换为精度低的类型时,会发生精度丢失。
显示转换的一般形式为:
(类型名)要转换的变量或常量
例如:
// 将数值36.9强制转换为int,精度丢失
int nTemp = (int)36.9;
// 声明double类型的变量
double dTemp = 12.15;
// 将double类型强制转换为int,精度丢失
int nV = (int)dTemp;
在上面的例句中,36.9是数值常量,默认为double类型,显示转换为int类型并赋值给nTemp,此时nTemp的值为36,精度丢失。
dTemp是double类型的变量,将dTemp的值赋值给int变量时,需要进行显示转换,int变量只存储double变量的整数部分,小数部分丢失。