这个问题 C++运算符(和其他几个(状态中的隐式类型转换规则
如果其中一个是长长无符号 int,另一个被提升为长长 无符号整数
但是,如果我在 MSVC 下执行以下操作:
unsigned int a = <some expression>;
unsigned long long b = a << 32ULL;
第二行生成以下警告:
warning C4293: '<<': shift count negative or too big, undefined behavior
32ULL
是一个 64 位无符号值,因此根据隐式转换规则,这应该意味着a
也转换为unsigned long long
。 因此,我将 64 位值移动 32 位,这显然是一个定义明确的操作。
MSVC 是否有错误或我的逻辑是否存在缺陷?
移位不做所谓的"通常的算术转换",这是你引用的规则。他们只进行整体促销。移位的结果与提升的左操作数的类型相同。