类型转换
表达式是运算符与数据连接起来的表达运算的式子,表达式也称运算式。1
C++语言中的所有操作都是用表达式表示的。例如:下面就是一个常见的表达式:
a>b&&c<d||e>>3!=0
1. 自动转换
C++语言支持不同数据类型的数据之间的混合运算。在对这样的表达式求值时,需要对其中的一些操作数进行类型转换。表达式中的类型转换有两种方式:自动转换和强制转换。
各种类型的高低顺序如下所示:
- 若参与运算量的类型不同,则先转换成同一类型,然后进行运算,转换按数据长度增加的 方向进行,以保证精度不降低,且运算的结果(即表达式的值)的类型是运算式的最终类型。
- 所有的浮点型运算都是以双精度进行的,即使仅含float单精度运算的表达式,也要先转 换成double型,再作运算。
- bool、char型和short型参与运算时,必须先转换成int型。
- 逻辑运算符要求参与运算的操作数必须是bool型,如果操作数是其它类型,编译系统会自 动将非0数据转换为true,0转换为false。
- 位运算的操作数必须是整数,当二元位运算的操作数是不同类型的整数时,也会自动进行 类型转换。
- 在赋值运算中,赋值号两边的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,可能丢失一部分数据,或降低精度。
int p=3.1; //降低了精度
float f=3.5; //未降低精度
- 将signed型的整型变成较长的signed型的整型,unsigned型变成较长的整型时,原值以及正负符号不变。
int a=-2;
long b=a;
//值仍为-2
- 将unsigned型和同长度的signed型互变时,其值根据自身所属范围发生适当的变化。
unsigned short a=65535;
short int b=a;// b的值变成-1
short int a=-2;
unsigned short b=a;// b的值变成65534
2. 强制类型转换
旧式的C语言风格的强制类型转换的格式如下:
类型说明符 (表达式) 或
(类型说明符) 表达式
例如:
int(a+b) //将a+b运算的结果转换成int型
5/float(3) //将3转换成float型
int a;float x=8.57;
a=(int)x;
//取整数部分,舍弃小数部分
//结果a=8,x仍为float型,其值仍为8.57。
注意:
➢ 采用强制类型转换将高类型数据转换为低类型数据时,数据精度可能会
受到损失。
标准C++强制类型转换:
static_cast <类型说明符> (表达式)
reinterpret_cast<类型说明符> (表达式)
const_cast <类型说明符> (表达式)
dynamic_cast <类型说明符> (表达式)
➢ static_cast用于一般表达式的类型转换。
例如:
int a;
float x=8.57;
a=static_cast <int> (x); //将变量x的类型转换成int型。
➢ reinterpret_cast用于非标准的指针数据类型转换,如将void 转换成char。
➢ const_cast将const表达式转换成非常量类型, 常用于将限制const成员函数的const定义解除。
➢ dynamic_cast用于进行对象指针的类型转换。
本教程仅供教学使用,参考教材 :《C++语言程序设计教程》,杨进才、沈显君编著,清华大学出版社,2022年1月第4版 ↩︎