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。
posted @ 2016-05-19 10:49  hu983  阅读(428)  评论(0编辑  收藏  举报