1.不同类型参与运算时,类型转变
其原则是将类型转变为表达式中可容纳范围最大的那个
int --> ungsigned int --> long --> unsigned long --> long long --> unsigned long long
float-->double-->long double
(如果long和int字长相同,unsigne int大于long)
暂时不考虑char和short类型转变(类型提升)
(1)如果两个运算对象一个是有符号的一个是无符号的,并且无符号的类型不小于有符号的类型,带符号的对象转换成无符号的类型;反之如果有符号的类型大,依赖于机器,如果带符号的能存储所有值,就转变成该带符号类型。
2.类型提升
进行运算的时候,char、short都转换为int类型,有必要时在运算完成后进行剪裁。
源类型 | 提升后的类型 |
char | int |
位段 | int |
枚举 | int |
unsigned char | int |
short | int |
unsigned short | int |
数组 | 相应的指针 |
如果int不能容纳原数据,则转化为unsigned int。
3.举个容易出错的实例
int main()
{
int d = -1;
unsigned int c= 1;
if (d < c)
cout << "hello visual studio" << endl;
else
cout << "wrong" << endl;
return 0;
}
该比较会出现问题,在比较时一个类型为int,另一个类型为unsigned int,在比较时都转换为unsigned int类型,所以d被转换为了一个很大的数,d=0xfffffffe,导致比较出错。
(尽量使用有符号类型或使用相同类型,使用显示类型转换)
4.显示类型转换
强制类型转化形式:
cast-name<type>(expression);//其中cast-name可以是static_cast,dynamic_cast,const_cast,reinterpret_cast
(1)static_cast:任何具有明确定义的类型转换,只要不包含底层const
(2)const_cast:只能改变运算对象的底层const,去掉const性质。(只改变常量的属性)
const char *cp;
const_cast<string>(cp);//invalid,只能改变常量的属性
(3)reinterpret_cast: