- 非
bool
类型的赋值给bool
类型,初始值为0
则结果为false
,否则为true
- 把
bool
赋值给非bool
得时候,初始值为false
则结果为0
,为true
则结果为1
- 把浮点数赋值给整型,结果值仅保留浮点树中小数点之前的部分(整数部分)。注意可能因为整型位数不够而变成负数
- 把整型赋值给浮点数,如果整型超过了浮点数的位数限制,精度可能损失
- 赋值给无符号类型一个超过它表示范围的值时,结果是对初始值对无符号类型表示数值总数取数取模后的余数。
- 赋值给带符号类型一个超出它表示范围的值时,结果是未定义的
bool
值进行关系运算的时候,也会转换成0
或者1
- 隐式转换发生的条件
- 大多数表达式当中,比
int
类型小的整型值首先提升为较大的整数类型 - 条件中,非布尔值转换成
bool
类型 - 初始化的初始值转换成变量的类型。赋值语句右侧转换成左侧
- 算术运算或者关系运算的运算对象有多种类型,需要转换成同一种类型
- 函数调用发生的类型转换
- 大多数表达式当中,比
- 初始化过程中,初始值转换成变量的类型,赋值语句中,右侧对象转换成左侧运算对象的类型
- 算术或者关系运算有多种类型,需要转换成同一种类型
- 函数调用发生类型转换
- 算数转换
- 整型提升
- 对于
bool
,char
,signed char
,unsigned char
,short
和unsigned short
。只要他们可能的值都能存在int
里,它们就都会提升成int
类型。否则提升到unsigned int
类型。 - 较大的
char
比如wchar_t
,char16_t
,char32_t
提升到int
,unsigned int
,long
,unsigned long
,long long
,unsigned long long
中最小的一种类型前提是转换后的类型要能容纳原类型所有可能的值
char32_t a = 0xffffffff; char32_t b = -0xffffffff; // c是unsigned int auto c = a - b; // d是unsigned int auto d = a + b;
- 无符号类型的运算对象
- 如果某个运算符的运算对象类型不一致,这么运算对象将转换成同一种类型。但是如果某个对象的类型是无符号类型,那么转换结果依赖各个整数类型的相对大小
- 负数转换成
unsigned
类型的时候,会变成正数 - 如果无符号类型不小于(这个大于的意思表示
long
比int
大这个意思)带符号类型,那么带符号的运算对象转换成无符号。比如unsigned int
和int
则int
类型的运算对象转换成unsigned int
。 - 如果带符号类型大于(这个大于的意思表示
long
比int
大这个意思)无符号类型,则依赖机器。如果无符号类型能存在带符号中,则无符号存在带符号中,如果不能那么带符号类型转换成无符号类型。long
和unsigned int
并且二者大小相同,则long
转换成unsigned int
。如果long
占用的空间比int
更多则unsigned int
转换乘long
类型
- 指针转换
0
和nullptr
可以转换成任意类型的指针- 任何非常量的指针能转换成
void*
,任意对象的指针可以转换成const void*
。有继承关系的类型之间还有另一种指针转换方式 - 编译器每次只能执行一种类型的转换,如果同时提出多个转换请求,这些请求将被拒绝
- 数组用作
decltype
关键字的参数,或者作为取地址符号&
,sizeof
以及typeid
等运算符的运算对象时,不会发生到指针的转换。或者使用数组的引用来初始化数组的时候也不会发生
// arrRef引用arr int (&arrRef)[10]=arr;
- 强制类型转换
- 格式
cast-name<type>(expression)
type
表示转换的目标类型而expression
表示要转换的值。如果type
是引用类型,则结果是左值。cast-name
是static_cast
,dynamic_cast
,const_cast
和reinterpret_cast
中的一种static_cast
,只要具有明确定义的类型转换(不能包含底层const
)都可以使用static_cast
。显示类型转换不会给出精度丢失warn
。不能包含底层
const
的原因如下
static_cast<T>(x)
的语义差不多是这样的:以x
为参数构造一个T
类型的返回值,这个转型的过程必需是在编译期可以确定的。
如果有const int x=10
:
static_cast<int>(x)
是正确的,因为你可以从一个const int
构造一个int
static_cast<const int &>
也是正确的,因为你可以依据const int
获得一个const int &
static_cast<int &>
是不正确的,因为你不能从const int
获得一个int &
,此时必需用const_cast
可以从const char *
正常构造一个std::string
,因为std::string
有这么一个构造函数。
但不能从const char *
构造一个int
,只能得到一个const int
。const_cast
只能改变运算对象的底层const
,并且不能改变类型
const char *pc; // 正确,但是通过p写值是未定义行为 char *p=const_cast<char*>(pc);
reinterpret_cast
为运算对象的位模式提供低层次上的重新解释
int *ip; // 这时候pc会把其内容当作字符串来解释 char *pc=reinterpret_cast<char*>(ip);
- 旧式强制类型转换。具有上述三种强制转换的功能
// 函数形式的强制类型转换 type (expr); // c语言风格的强制类型转换 (type) expr;
- 格式
c++类型转换
最新推荐文章于 2024-03-07 22:55:22 发布