C++定义了一组内置类型对象之间的转换标准,在必要的时候它们被编译器隐式的转换
1、任何两种或多种类型的数据和变量混合操作的时候,最宽的数据类型成为目标转换类型(常量和变量都会被改变)
2、不同类型的表达式之间赋值的时候,被赋值的对象类型成为目标转换类型
3、函数调用实参和形参类型不一致的时候,形参的对象类型成为目标转换类型
4、函数的返回值类型和函数表达式的类型不一样的时候,函数表达式的类型成为目标转换类型
注意:算术运算中两个通用的的指导准则如下
(1)为了防止精度损失,类型总是被提升为较宽的类型。
(2)所有含有小于整型的有序类型的算术表达式在计算之前其类型都会被转换成整型(即整数提升),计算完之后再转换为被定义的类型。
按照从高到低的顺序给各种数据类型分等级,依次为:long double, double, float, unsigned long long, long long, unsigned long, long, unsigned int 和 int。这里有一个小小的例外,如果 long 和 int 大小相同,则 unsigned int 的等级应位于 long 之上。char 和 short 并没有出现于这个等级列表,是因为它们应该已经被升级成了 int 或者 unsigned int。
例如:
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int a[]={1,2,2,3,4}; 6 int n=sizeof(a); 7 if(-1>(n/sizeof(int))) 8 cout<<"1"; 9 else 10 cout<<"2"; 11 return 0; 12 }
上述代码的输出结果竟然是1,原因在于sizeof()的返回类型是unsigned int,而-1是int,所以-1被隐式的转换成了unsigned int类型,而变成了
oxffffffff,当然就比5大了。
第一段代码相当于这样
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int a[]={1,2,2,3,4}; 6 int n=sizeof(a); 7 unsinged int b=n/sizeof(int); 8 if(-1>b) 9 //if(-1>(n/sizeof(int))) 10 cout<<"1"; 11 else 12 cout<<"2"; 13 return 0; 14 }
如果把这段代码中第7行改为 int b=n/sizeof(int)的话,就会输出2了
这也告诉我们在写程序的时候要尽量避免多种类型的混合操作。