C/C++中的隐式类型转换
代码:
1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 int main(int argc,char* argv[]){ 7 8 int i = -1; 9 unsigned j = 1; 10 if(i>j) 11 cout<<"i>j"<<endl; 12 else 13 cout<<"no"<<endl; 14 if(i<j) 15 cout<<"i<j"<<endl; 16 else 17 cout<<"no"<<endl; 18 19 unsigned k = (1<<32)-1; 20 cout<<k<<endl; 21 if(i == k) 22 cout<<"i=k"<<endl; 23 else 24 cout<<"no"<<endl; 25 26 return 0; 27 }
输出:
i>j no 4294967295 i=k
分析:
如果表达式包含signed和unsigned int,signed会被转换为unsigned。如果int 操作数的值恰为负数,其转换为unsigned int可能会变为一个很大的正数(转换结果是该负值对unsigned int的取值个数求模)。所以最好避免对int和unsigned int的两个操作数进行比较。
算术转换通常的是做整形提升(integral promotion),对于所有比int小的整形,包括char、signed char、unsigned char、short和unsigned short,如果该类型的所有可能的值都能包含在int内,它们就会被提升为int,否则被提升为unsigned int。如果将bool值提升为int,则false转换为0,true转换为1。
包含short和int类型的表达式,short转换为int。如果int足以表示所有unsigned short类型的值,则将unsigned short转换为int,否则两个操作数均转换为unsigned int。long和unsigned int的转换也一样。只要机器上的long足够表示unsigned int类型所有的值,就将unsigned int转换为long,否则两个操作数都转换为unsigned long。在32位的机器上,long和int通常用一个字长表示,此时如果表达式包含unsigned int和long,两者都转换为unsigned long。