在对赋值表达式求解过程中,如果赋值运算符两边的数据类型不一致,赋值时要进行类型转换。其转换工作由C编译自动实现,转换原则是以“=”左边的变量类型为准的。即将“=”右边的值转换为与“=”左边的变量类型一致。
【程序2-4】用下面的程序进行说明:
/* 文件名:chap02_4.cpp */
#include <stdio.h>
void main()
{
int i=5; /*说明整型变量i并初始化为5*/
float a=3.5,a1; /*说明实型变量a和a1并初始化a*/
double b=123456789.123456789; /*说明双精度型变量b并初始化*/
char c='A';/*说明字符变量c并初始化为'A'*/
printf("i=%d,a=%f,b=%f,c=%c\n",i,a,b,c); /*输出i,a,b,c的初始值*/
a1=i;i=a;a=b;c=i; /*整型变量i的值赋值给实型变量a1,实型变量a的值赋给整型变量i,双精度型变量b的值赋值给实型变量a,整型变量i的值赋值给字符变量c*/
printf("i=%d,a=%f,a1=%f,c=%c\n",i,a,a1,c); /*输出i,a,a1,c赋值以后的值*/
}
运行该程序的输出结果如下:
i=5,a=3.500000,b=123456789.123457,c=A
i=3,a=123456792.000000,a1=5.000000,c=(心形字符)
由以上运行结果可见:
将float型数据赋值给int型变量时,先将float型数据舍去其小数部分,然后再赋值给int型变量。例如"i=a;"的结果是:int型变量i只取实型数据3.5的整数3。
int型数据赋给float型变量时,先将int型数据转换为float型数据,并以浮点数的形式存储到变量中,其值不变。例如"a1=i;"的结果是:整型数5先转换为5.000000再赋值给实型变量a1。如果赋值的是双精度实数,则按其规则取有效数位。
double型实数赋给float型变量时,先截取double型实数的前7位有效数字,然后再赋值给float型变量。例如"a=b;"的结果是:截取double型实数123456789.123457的前7位有效数字1234567赋值给float型变量。上述输出结果中a=123456792.000000的第8位以后就是不可信的数据了。所以一般不使用这种把有效数字多的数据赋值给有效数字少的变量。
int型数据赋值给char型变量时,由于int型数据用2个字节表示,而char型数据只用1个字节表示,所以先截取int型数据的低8位,然后赋值给char型变量。例如上述程序中执行"i=a;"后int型变量i的结果是3,而"c=i;"的结果是:截取i的低8位(二进制数00000011)赋值给char型变量,将其ASCII码对应的字符输出。