C 程序设计教程(07)—— 数据类型转换
该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。
目录
- C 程序设计教程(07)—— 数据类型转换
- 一、自动类型转换
- 二、赋值类型转换
- 三、强制类型转换
各种类型的数据可以混合运算,例如:
x = 10+'a'+1.5-12.34*'b';
在进行混合运算时,不同类型的数据要转换成同一类型的数据。
一、自动类型转换
混合于同一表达式中的不同类型常量及变量,应变换为同一类型的量。编译程序将所有操作数变换为与最大类型操作数同类型。具体规则如下:
(1)所有 char 及 short int 型量转换为 int 型,所有 float 转换为 double。
(2)如果操作数对中一个为 double,另一个转换为 double。否则,一个为 long,另一个转换为 long。
(3)一个为 unsigned,另一个转换为 unsigned。
通过以上规则,每一对操作数均变为同一类型。例如:
#include<stdio.h>
int main()
{
char ch='A';
int i=2;
float f=2.5;
double d=1.2,result;
result=ch/i+f*d-(f+i);
//(1)执行 ch/i=32,把ch转换为int类型
//(2)执行f*d=3.0,把f转换为double类型
//(3)执行f+i=4.5,把f和i转换为double类型
//(4)执行32+3.0-4.5=30.5
printf("%lf\n",result);
return 0;
}
以上程序的运行结果如下:
二、赋值类型转换
进行赋值运算时,当赋值运算符两边的数据类型不用时,将由系统自动进行类型转换。
转换的原则是:赋值运算符右边的数据类型转换成左边的变量类型。转换规则如下:
赋值运算符左侧类型 | 赋值运算符右侧类型 | 转换说明 |
---|---|---|
float | int | 将整型数据转换成实型数据后再赋值。 |
int | float | 将实型数据的小数部分截去后再赋值。 |
long | int、short | 值不变 |
int、short | long | 右侧的值不能超过左侧数据值的范围。否则将会导致不可预料的结果。 |
unsigned | signed | 按原样赋值。右侧的值不能超过左侧数据值的范围。 |
signed | unsigned | 按原样赋值。右侧的值不能超过左侧数据值的范围。 |
例如:
#include<stdio.h>
int main()
{
char ch;
int i;
float f;
double d;
long l;
short s;
i=1;
f=i;
printf("%f\n",f);
f=25.8;
i=f;
printf("%d\n",i);
s=5;
l=s;
printf("%d\n",l);
l=56;
i=l;
printf("%d\n",i);
l=3466347634764; //数值太大
i=l;
printf("%d\n",i); //输出错误
return 0;
}
以上程序的运行结果如下:
三、强制类型转换
强制类型转换通过类型转换运算来实现。格式为:
(type)exp;
其功能是把表达式的运算结果强制转化成类型声明符所表示的类型。例如:
#include<stdio.h>
int main()
{
int i;
for(i=1;i<=100;i++)
{
printf("%d/2 is:%f ",i,(float)i/2);
if(i%5==0) printf("\n");
}
return 0;
}
以上程序的运行结果如下:
说明:
(1)类型声明符和表达式都必须加括号(单个变量可以不加括号)。例如:(int)(x+y) 表示把 x+y 的运算结果强制转换为 int 型。而 (int)x+y 表示把 x 强制转换为 int 型之后再和 y 相加。
(2)无论是强制转换还是自动转换,都只是为了本次运算的需要而对变量进行的临时性转换,而不改变变量本身的类型。