2.7 C语言数据类型转换
C语言中变量的数据类型是可以转换的,转换的方法有两种:一种是自动转换,一种是强制转换。
1.自动转换
自动转换发生在不同数据类型的量进行混合运算时,由编译系统自动完成。自动转换遵循以下规则。
(1)若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
(2)转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int型转成long型后再进行运算。
(3)所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
(4)char型和short型参与运算时,必须先转换成int型。
以上的转换规则可以用图2.3所示。
图2.3 转换规则
例如,有如下定义:
int m;
float n;
double d;
long int e;
对表达式('c'+'d')×20+m×n-d/e在运算时是这样转换的:
① 计算('c'+'d')时,先将字符常量'c'和'd'转换成整型数99、100,运算结果为199;
② 计算('c'+'d')×20结果为3 980;
③ 计算m×n时,先将m和n都转换成双精度型;
④ 计算d/e时,将e转换成双精度型,d/e结果为双精度型;
⑤ 最后将3980转换成双精度型,然后与m×n的结果相加,再减去d/e的结果,表达式计算完毕,结果为双精度浮点型数。
(5)在赋值运算中,如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。具体规定如下。
① 浮点型赋予整型,舍去小数部分。
② 整型赋予浮点型,数值不变,但将以浮点形式存放,即增加小数部分(小数部分的值为0)。
③ 字符型赋予整型,由于字符型为一个字节,而整型为两个字节(Turbo C中),当ASCII码为0~127时,将字符的ASCII码值放到整型量的低八位中,高八位为0;当ASCII码为128~255时,将字符的ASCII码值放到整型量的低八位中,高八位为1。
④ 整型赋予字符型,只把低八位赋予字符量,数据有可能发生改变。
【例2.14】 浮点型与整型的赋值转换。
#include <stdio.h>
void main()
{
int a;
float x;
a=8.88;
x=322;
printf("%d,%f\n",a,x);
}
【例2.15】 字符型与整型的赋值转换。
#include <stdio.h>
void main()
{
int a,b=322;
char c1='k',c2;
a=c1;
c2=b;
printf("%d,%c\n",a,c2);
}
程序分析:字符型量 c1 赋予整型变量 a,高字节补 0,得到整型数据 107;整型变量 b赋予c2 后取其低八位成为字符型(b的低八位为01000010,即十进制66,按ASCII码对应于字符B)。
2.强制类型转换
强制类型转换是通过强制类型转换运算符来实现的,其一般形式为:
(类型说明符) (表达式)
其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。当被转换的表达式是一个简单表达式时,外面的一对圆括号可以缺省。例如,变量 a 为整型变量,变量 x、y为浮点型变量,则:
(float) a 表示把a转换为单精度浮点型
(int)(x+y) 表示把x+y的结果转换为整型
在使用强制类型转换时应注意以下问题。
① 类型说明符和表达式都必须加括号(单个变量可以不加括号),如上例把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。
② 无论是强制转换还是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。
【例2.16】 强制类型转换。
#include<stdio.h>
void main(void)
{
float f=5.75;
printf("(int)f=%d,f=%f\n",(int)f,f);
}
上例中,f原定为float型,则(int)f只是将变量f的值转换成一个int型的中间量,f的数据类型并未转换成int型,仍为float型。