运算过程中,当参与运算的操作数类型不同时,可进行类型转换。包括:自动转换和强制转换。
自动类型转换指在算术运算以及在赋值过程中,如果运算符两边的操作数属于“类型相容”(指类型不同但系统可以自动进行转换)的情况,如整数、字符和实数之间,系统会自动进行类型转换,然后再做运算。包括:算术类型转换、赋值类型转换。
一.混合运算的类型转换
当运算符两边的操作数类型不同但类型相容时,系统自动将不同的数据类型转换成相同类型,再进行运算。
具体规则如下:
- 字符可作为整数参与运算,整数值为其ASCII码。
- 对于字符或短整型操作数,系统自动变换成整型。
- 对于单精度型操作数时,系统自动变换成双精度型。
- 当两操作数类型不同时,将精度低(或表示范围小)的操作数的数据类型变换成与另一操作数类型相同,再进行运算。变换关系如图1.2所示。
图1.2 数据类型转换规则
举例说明:
例如,设有变量
char c1, c2;
int i1, i2;
float x1, x2;
则表达式 x2=c1*i1+c1*x1+c1*c2 的求值过程为:
- 将c1转换成整型,完成c1*i1,结果为t1;
- 将c1和x1转换成双精度型,完成c1*x1,结果为t2;
- 将c1和c2均转换成整型,完成c1*c2,结果为t3;
- 将t1转换成双精度型,完成t1+t2,结果为t4;
- 将t3转换成双精度型,完成t4+t3;
- 最后结果转化为单精度型,赋给x2。
二.赋值类型转换
当赋值号左值和右值类型不一致但类型相容时,系统将自动进行类型转换。
转换规则如下:
- 实型数赋给整型变量时,仅取整数部分;若该部分超出整型变量取值范围,结果将溢出。
- 整数赋给实型变量时,将整数转换成实数再赋值。
- 字符数据赋给整型变量时,将字符转换为整型。转换分两种情况:
- 对无符号字符数据,低位字节不变,高位字节补0;
- 对有符号字符数据,若符号位为0,与无符号字符数据转换规则相同,若符号位为1,则低位字节不变,高位字节全部置1。
- 绝对值较大的数赋给表达范围较小的数据时,注意溢出
举例说明:
例如:设有变量
signed char c1=250;
short int a;a=c1;
【分析】:c1的值为11111010,转换成11111111 11111010赋给a,正是- 6的补码。所以,a的值为- 6。
三.强制类型转换
如果需要人为地将一种类型转换为另一种类型,必须使用C++提供的强制类型转换运算符。一般格式为:
(<type>) <表达式> 或: <type> (<表达式>)
注意:对整个表达式作强制类型转换。
举例说明:
设有变量说明:int a=7, b=5; float x; 求表达式 x=a/b 的值。
【分析】:因为a和b都是整数,该除法将执行整除运算,再将整数结果1转换为单精度类型后进行赋值。所以,结果 x=1
【转换】:将两个操作数或其中一个操作数进行强制类型转换。可表示为:
x=(float)a/(float)b或x=(float)a/b
表达式将求出这两个整数相除的实数商1.4,并赋给x。
关于强制类型转换需要注意的几点:
- 上述(float)a/b与float(a/b)结果是不同的,后者是先进行整除运算,将结果(整数1)强制转换为单精度型数1.0,所以结果为 x=1.0。
- 强制类型转换不改变表达式本身的值类型,而是产生一个临时变量,用来暂存转换后的值,该临时变量引用后即自动释放。如上例,执行强制类型转换后变量a和b的值及类型都不变,而是各自产生一个临时变量,用这两个临时变量的值进行运算。
- 强制类型转换符优先级较高,只对紧随其后的表达式起作用,而对其他部分不起作用。