数据类型之间的隐式转换

时间:2011-03-15 21:41:25

标签: c++ type-conversion

为什么unsigned shortint之间的操作结果总是产生int

unsigned short s = 65535;
int i = 65535

表达式typeid(s * i * i).name(),给出一个超出int范围的值,但隐式转换仍返回int,为什么?

1 个答案:

答案 0 :(得分:12)

在评估大多数算术运算符之前,有一组称为usual arithmetic conversions的转换。

基本上,您可以考虑对整数算术有一些规则:

  • 首先,从不使用“小于”int的操作数执行整数运算,因此对于short * signed charshortsigned char都是如此操作数被提升为int,两个int值相乘,然后结果为int

  • 其次,如果一个或两个类型都“大于”int,则编译器会选择一个类型,该类型至少与最大操作数的类型“一样大”。因此,如果您有long * int,则int会提升为long,结果为long

  • 第三,如果任一操作数为unsigned,则结果为无符号。因此,如果您有long * unsigned int,则longunsigned int都会提升为unsigned long,结果为unsigned long

    < / LI>

如果任一操作数具有浮点类型,则执行浮点运算:使用floatdoublelong double(哪一个取决于操作数的类型;用于确定结果类型的完整表可以在本答案开头链接的页面上找到。)

请注意,结果类型不依赖于操作数的值。在知道值之前,编译器必须在编译时选择类型。

如果s * i * i的结果超出了结果类型的范围(int,在您的方案中),那么您运气不好:您的程序无法在运行时决定,“哦,我应该切换到使用long!“因为必须在编译时选择结果类型。