您所看到的是算术表达式期间发生的所谓“通常算术转换”的结果,尤其是那些本质上是二进制的(带两个参数)。
这在 §5/9 中有描述:
许多期望算术或枚举类型的操作数的二元运算符会以类似的方式导致转换和产生结果类型。目的是产生一个通用类型,这也是结果的类型。这种模式称为通常的算术转换,其定义如下:
— 如果任一操作数为 类型long double
,则另一个应转换为long double
。
— 否则,如果任一操作数为double
,则另一个应转换为double
。
— 否则,如果任一操作数为float
,则另一个应转换为float
。
— 否则,应在两个操作数上执行积分提升 (4.5)。54)
— 然后,如果任一操作数是unsigned long
另一个,则应转换为unsigned long
.
— 否则,如果一个操作数是 along int
而另一个是unsigned int
,那么如果 along int
可以表示 an 的所有值unsigned int
,unsigned int
则应将 a 转换为 a long int
;否则两个操作数都应转换为unsigned long
int
.
— 否则,如果任一操作数为long
,则另一个应转换为long
。
— 否则,如果任一操作数为unsigned
,则另一个应转换为unsigned
。
[注意:否则,唯一剩下的情况是两个操作数都是int
]
§4.5 中提到的促销活动是:
1如果可以表示源类型的所有值,则可以将类型为char
、signed char
、unsigned char
、short int
或unsigned short int
的右值转换为类型的右值;否则,源右值可以转换为类型的右值。 int
int
unsigned int
2 类型wchar_t
(3.9.1) 或枚举类型 (7.2) 的右值可以转换为以下第一种类型的右值,这些类型可以表示其基础类型的所有值:int
、unsigned int
、long
或unsigned long
。
int
3如果int
可以表示位域的所有值,则整数位域 (9.6) 的右值可以转换为类型的右值;否则,它可以转换为unsigned int
如果unsigned int
可以表示位域的所有值。如果位域更大,则不会对其应用积分提升。如果位字段具有枚举类型,则出于提升目的,将其视为该类型的任何其他值。
4 类型的右值bool
可以转换为类型的右值int
,false
变为零和true
变one
。
5 这些转换称为积分促销。
从这里开始,诸如“乘法运算符”或“加法运算符”之类的部分都有短语:“执行通常的算术转换... ”来指定表达式的类型。
换句话说,当您进行积分算术时,类型由上述类别确定。在您的情况下,促销包含在 §4.5/1 中,表达式的类型是int
.