这很简单。移位运算结果的类型是 LHS 操作数的类型。对于大多数二元运算符,结果同时基于 LHS 和 RHS 操作数,但移位运算符不同。
unsigned char uc = 0x08;
unsigned short us = 0x0008;
unsigned int ui = 0x00000008;
unsigned long long ul = 0x0000000000000008;
(我假设sizeof(unsigned int) == 4
这个答案。如果不同,细节必须改变,但概念保持不变。)
现在考虑一些表达式:
uc + uc;
两种类型都转换为int
,结果为int
.
us + us;
同样,两种类型都转换为int
,结果为int
.
us + ui;
ui + us;
in 的值us
被转换为unsigned int
,结果为unsigned int
(注意之前的值被转换为signed int
aka int
)。
ui + ul;
ul + ui;
这两个表达式都转换ui
为 anunsigned long long
并且结果是unsigned long long
。请注意,这些表达式是对称的;结果的类型(实际上,对于+
运算符,结果的值)不取决于哪个值在 LHS 上,哪个在运算符的 RHS 上。
普通操作就这么多;现在轮班呢?
uc << uc;
LHSint
通过通常的算术转换转换为int
.
us << us;
这个结果也是一个int
。
ui << ui;
这个结果是一个unsigned int
。
ul << ul;
这个结果是一个unsigned long long
。但是混合类型呢?
uc << ul; // Result: int
ul << uc; // Result: unsigned long long
us << ui; // Result: int
ui << us; // Result: unsigned int
ui << ul; // Result: unsigned int
ul << ui; // Result: unsigned long long
LHS 操作数的提升类型控制结果的类型。对于比 短的类型int
,结果是int
; 对于其他类型,类型是 LHS 操作数的类型。
这就是你引用的全部意思。