2. 类型转换
2.1 C++转换方式
- 自动类型转换(隐式转换):遵循一定的规则,由编译系统自动完成
- 强制类型转换:把表达式的运算结果强制转换成所需的数据类型
C++自动执行很多类型的转换:
-
将一种算数类型的值赋值给另一种算数类型的变量时
double d=5;
-
表达式中包含不同类型时
double d=2.0; int i=10; double x=d+i;
-
将参数传递给函数时
2.2 初始化和赋值进行的转换
-
值赋值给取值范围更大的类型
short s=12; int i=s;
-
值赋值给取值范围更小的类型
double d=3.1415926; float f=d;
- 0赋值给
bool
变量时,将被转换为false
,非零值转换为true
2.3表达式中的转换
自动类型转换
同一个表达式中包含多种不同的算数类型时,C++将执行两种自动转换:
- 一些类型在出现时会自动转换
bool
、char
、unsigned char
、signed char
值转换为int
,true
转换为1,false
转换为0,这些被称为整型提升- 如果
short
比int
短,则unsigned short
转换为int
,如果长度相同,则unsigned short
转换为unsigned int
,从而确保在对unsigned short
提升时不会丢失数据
- 有些类型在与其他类型同时出现在表达式中时将被转换
- 当运算涉及两种类型时,较小的类型将被转换为较大的类型。
- 编译器通过校验表来确定在表达式中执行的转换
- 如果有一个操作数类型为
long double
,则将另一个操作数转换为long double
- 否则,如果有一个操作数类型为
double
,则将另一个操作数转换为double
- 否则,如果有一个操作数类型为
float
,则将另一个操作数转换为float
- 否则,说明操作数都是整型,因此执行整型提升
- 如果有一个操作数类型为
强制类型转换
C++允许通过强制类型转换机制显式地进行类型转换
强制类型转换格式:
(typeName) value;
或 typeName (value);
long l=(long) num;
//或者
long l=long(num);
强制类型转换不会修改转换的变量本身,而是创建一个新的、指定类型的值
优先级问题:
(int)a+b;//对a进行强制类型转换
(int)(a+b);//对(a+b)的结果进行强制类型转换