1、发生隐式转换的情况
- 混合类型表达式中,转换为相同的类型
int ival = 2; double dval = 2.1; ival >= dval; //int型转换为double型
- 条件表达式转换为bool类型
if(ival) //int型转换为bool型 { //body }
- 初始化或赋值某个变量时,转换为给变量类型
int ival = 3.14; //3.14 convert to int 3 int *p; p = 0; //int 0 convert to pointer null
2、算术转换规则
(1)有符号无符号类型之间的转换:这类转换的本质依赖于机器
- short和int表达式,short转为int;
- 如果int型足够表示所有unsigned short型的值,则将unsigned short转换为int,否则将两个操作数均转换为unsigned int 型。如short型用半字表示,int型用一个字表示,则所有unsigned short值都包含在int内,则unsigned short转换为int;
- 如果long型足够表示所有unsigned int型的值,则将unsigned int转换为long,否则将两个操作数均转换为unsigned long 型;
- signed和unsigned的表达式,signed转换为unsigned。但是当signed类型恰好存储的是负数时,将产生意料之外的后果。如
signed val = -1; unsigned nval = 2; if(nval >= val){ cout<<"ok"<<endl; }else{ cout<<"error"<<endl; }
输出结果是error。原因是val=-1,转化成unsigned型的结果是该负数对该类型取值个数求模的值,所以val转换为unsigned型后为255。
(2)整型提升:最简单的一种转换
对于所有比int小的整型,包括char、signed char、unsigned char、short和unsigned short,如果该类型的所有可能的值都能包容在int内,他们都会被提升为int型,否则它们将被提升为unsigned int。
考虑,unsigned short 类型是两个字节。unsigned类型是四个字节,long在32位机上也是四个字节。则下边的代码运行结果是什么?输出结果见注释。
unsigned short us1 = 65534;
unsigned short us2 = 2;
unsigned uint = us1+us2;
cout<<"uint = "<<uint<<endl; //ok,uint = 65536
cout<<us1<<" + "<<us2<<" = "<<us1+us2<<endl; //ok,65534 + 2 = 65536
unsigned us1 = 4294967294;
unsigned us2 = 3;
double ul = us1+us2;
cout<<"uint = "<<ul<<endl; //u1=1
cout<<us1<<" + "<<us2<<" = "<<us1+us2<<endl; //us1+us2=1
(3)由标准库类型定义的转换:类类型可以定义由编译器自动执行的数据转换。
string s;
while(cin>>s);
上边的例子,while循环条件应为bool类型值,但cin>>s返回的是istream类型的值,将istream类型值转换为bool类型意味着要检验流的状态。
(4)其他隐式转换
指针转换,转换为bool类型,算术类型与bool类型的转换,与枚举类型的转换,转换为const对象。