为什么unsigned short
和int
之间的操作结果总是产生int
?
unsigned short s = 65535;
int i = 65535
表达式typeid(s * i * i).name()
,给出一个超出int
范围的值,但隐式转换仍返回int
,为什么?
答案 0 :(得分:12)
在评估大多数算术运算符之前,有一组称为usual arithmetic conversions的转换。
基本上,您可以考虑对整数算术有一些规则:
首先,从不使用“小于”int
的操作数执行整数运算,因此对于short * signed char
,short
和signed char
都是如此操作数被提升为int
,两个int
值相乘,然后结果为int
。
其次,如果一个或两个类型都“大于”int
,则编译器会选择一个类型,该类型至少与最大操作数的类型“一样大”。因此,如果您有long * int
,则int
会提升为long
,结果为long
。
第三,如果任一操作数为unsigned
,则结果为无符号。因此,如果您有long * unsigned int
,则long
和unsigned int
都会提升为unsigned long
,结果为unsigned long
。
如果任一操作数具有浮点类型,则执行浮点运算:使用float
,double
或long double
(哪一个取决于操作数的类型;用于确定结果类型的完整表可以在本答案开头链接的页面上找到。)
请注意,结果类型不依赖于操作数的值。在知道值之前,编译器必须在编译时选择类型。
如果s * i * i
的结果超出了结果类型的范围(int
,在您的方案中),那么您运气不好:您的程序无法在运行时决定,“哦,我应该切换到使用long
!“因为必须在编译时选择结果类型。