一、运算对象既包含无符号类型也有带符号类型
1. 无符号类型不小于带符号类型,带符号的运算对象将转换成无符号的
如:假设两个运算对象的类型分别为 unsigned int 和 int,那么 int 类型的运算对象将转换成 unsigned int 类型。
unsigned a = 0; int i = -1; auto x = a + i; //x类型被自动转换为unsigned,在这个表达式a+i内,i的值转换为-1+232
cout << a << " " << i << " " << x << endl; //a为0,i为-1,x为4294967295
表达式 a+i 中,i 的类型会被转换为 unsigned 类型,但是由于 i 是负值,所以 i 的值会变为这个负值加上无符号数的模(即232)。
2. 无符号类型小于带符号类型,此时转换的结果依赖于机器
- 如果无符号类型的所有值都能存在该带符号类型中,则无符号类型的运算对象转换成带符号类型;
- 如果....................................不能....................................,则带符号类型的运算对象转换成无符号类型。
二、指针的转换
常量整数值0或字面值nullptr能转换成任意指针类型
指向任意非常量的指针能转换成void *
指向任意对象的指针能转换成const void *
三、static_cast
作用于:任何具有明确定义的类型转换,只要不包含底层const。
其他:可以执行编译器无法自动执行的类型转换。
如:double ans = static_cast<double>(j) / i;
四、const_cast
作用于:只能改变运算对象的底层const,不能改变表达式的类型
其他:改变表达式的常量属性
const char *pc; //底层const char *p = const_cast<char *>(pc); //通过p写值是未定义的行为
我们称“将常量对象转换成非常量对象的行为”为去掉const性质。
我们去掉某个对象的const性质后,便可以对该对象进行写操作,如果此对象是一个常量,则使用const_cast执行写操作会产生未定义的后果。
const char *pc; //底层const char *q = static_cast<char *>(pc); //错误,static_cast不能去掉const性质 static_cast<string>(pc); //正确,字符串字面值转换成string类型 const_cast<string>(pc); //错误,const_char只改变常量属性
补充:const_cast常常用于函数重载的上下文中
五、reinterpret_cast
看不懂!!!!!!!!!!!