2.6 不同数据类型之间的转换

学习提示

【理解】数据的自动转换和强制转换

如果一个运算符两边的运算数类型不同,那么,要先将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,此过程由编译系统自动完成。这种转换又可以分为两种不同的情况。

① 当运算符两边是不同精度同一种数据类型时,编译器进行同一类型间的转换。

例如

   floata;

   floatb;

   doublec;

   c=a+b ;

说明

这时进行的就是浮点型之间的转换。虽然它们类型相同,但仍要先转成double型,再进行运算,结果也为double型(注意:在VC6.0中,所有的float类型数据在运算中都自动转换成double型数据)。所以对于浮点型数据的转换方向可以描述为:

float->double

这表示float类型向double类型的转换。同样也可以将整型数据之间的转换方向描述为:

int->long

即如果一个long型数据与一个 int型数据一起运算,需要先将int型数据转换为long型数据,然后两者再进行运算,结果为long型数据。

② 参与运算的运算数类型不同,则先将它们转换成同一种类型,然后进行运算。转换方向可以描述为:

int->double(float)

即当整型数据与浮点型数据进行运算时,往往是整型数据向浮点型数据转换。

在赋值运算中,赋值号两边运算数的数据类型不同时,赋值号右边运算数的类型将转换为左边运算数的类型。

【例2-5】根据圆的半径求圆的面积。

程序代码

#include<stdio.h>

void main( )

{ float pi=3.14;/*定义一个浮点型变量并初始化*/

 int s,r=5;/*定义两个整型变量,分别表示圆的半径和面积*/

 s=r*r*pi;/*求圆的面积*/

 printf("s=%d\n",s);

/*输出圆的面积*/

分析一下本程序的输出结果的类型。

●pi为浮点型数据,s、r为整型数据。

●在执行 s=r*r*pi;语句时,r和 pi都转换成实型进行计算,结果仍为实型。

●由于s为整型,因此赋值结果仍为整型,会舍去小数部分。

所有这些转换都是由系统自动进行的,使用时只需从中了解结果的类型即可。

另一方面,C语言也提供了强制类型转换的机制,其一般形式为:

(类型说明符)(表达式 )

说明

这种类型转换的效果是把表达式的类型强制转换为要求的类型,而不管类型的高低。其中,“类型说明符”指明了要求转换的目标类型;“表达式”指明了要强制转换的表达式。

需转换的表达式如果不是单个的变量,则要用括号将其括起来,如(int)(x+y)与(int)x+y是不同的,后者相当于(int)(x)+y,也就是说,只将 x转换成整型,然后与y相加。无论是强制转换或是自动转换,都不会改变数据说明时对该变量定义的类型。

例如

   (double)a

   (int)(x+y)

前者是将a转换成double型,而不管a先前是什么类型的数据。后者的效果是将x+y的结果转换为 int型,不论 x和 y是何种类型的数据。

请注意

①字符型数据向整型数据转换时,实质上是将字符型数据转换成与该字符对应的十进制ASCII码值。

②在进行赋值运算时,实质上是将运算符右边的数据类型强制转换成运算符左边的数据类型。

【例2-6】强制类型转换。

程序代码

#include<stdio.h>

void main( )

{float f=1.2345;/*定义一个浮点型变量f,并初始化为1.2345*/

 int a;/*定义一个整型变量*/

 a=(int)f;

/*将浮点型变量强制转化为整型值*/

 printf("a=%d,f=%f\n",a,f);

/*输出整型变量a和浮点型变量f的值*/

本程序的输出结果是:

   a=1,f=1.234500

分析程序可知:

① 本例中首先将 f强制转换成 int类型,然后赋值给变量a,所以a的值是1;

② f虽然强制转为int型,但只在运算中起作用,而f本身的类型并不改变,f的值仍为1.2345。

真题演练

【例1】有以下程序:

#include<stdio.h>

#include<math.h>

main( )

{ inta=1,b=4,c=2;

 doublex=10.5,y=4.0,z;

 z=(a+b)/c+sqrt(y)*1.2/c+x;printf("%f\n",z);

程序运行后的输出结果是(  )

A)13.700000

B)14.000000

C)15.400000

D)14.900000

【解析】如果一个运算符两边的运算数类型不同,要先将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算。程序执行过程为:a+b=5,5/2=2(int类型),sqrt(y)=2.0(double类型),2.0*1.2/2=1.2(double类型),z=2.0(由int类型自动转换成double类型)+1.2+10.5=13.7。因此A选项正确。

【答案】A

【例2】若有以下程序段:

doublex=5.16894;

printf("% f\n",(int)(x*1000+0.5)/(double)1000);

则程序段的输出结果是( )

A)5.170000    B)5.175000

C)5.169000    D)5.168000

【解析】%f的输出格式是以带小数点的数学形式输出浮点数。首先计算x*1000,结果为5168.94,然后该结果加0.5,结果为5169.44,然后进行强制类型转换,转换成整型为5169,再除以双精度数据1000,结果也为双精度数据5.169,输出时按照%f的格式输出,所以输出结果为5.169000。

【答案】C

【例3】若在程序中变量均已定义成int类型,且已赋大于1的值,则下列选项中能正确表示代数式的表达式是( )

A)1.0/a/b/c

B)1/(a*b*c)

C)1.0/a*b*c

D)1/a/b/(double)c

【解析】由于a、b、c均大于1,所以表达式1/abc小于1,需要用浮点类型表示。若要计算表达式值,需要使其自动转化成浮点类型,所以 A选项正确。B选项由于变量与常量均为整型,不会自动转换为浮点类型,所以B选项错误。C选项表示表达式bc/a,故错误。D选项,由于算数运算法结合性自左向右,先计算1/a,结果为0,之后的计算无论是否转换数据类型结果均为0,所以D选项错误。

【答案】A