C语言程序设计教程
上QQ阅读APP看书,第一时间看更新

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型。