隐式转换:以下警告是否有效?

dgn*_*uff 10 c++ bit-shift unsigned-long-long-int integer-promotion language-lawyer

这个问题C++运算符(和其他几个)中的隐式类型转换规则

如果其中一个是long long unsigned int,则另一个被提升为long long unsigned int

但是,如果我在MSVC下执行以下操作:

unsigned int a = <some expression>;
unsigned long long b = a << 32ULL;
Run Code Online (Sandbox Code Playgroud)

第二行生成以下警告:

warning C4293: '<<': shift count negative or too big, undefined behavior
Run Code Online (Sandbox Code Playgroud)

32ULL是一个64位无符号值,因此根据隐式转换规则,这应该意味着a转换unsigned long long为.因此,我将64位值移位32位,显然是一个定义明确的操作.

MSVC是否有漏洞或者我的逻辑存在缺陷?

T.C*_*.C. 15

转移不会进行所谓的"常规算术转换",这是您引用的规则.他们只进行整体促销.移位的结果与提升的左操作数的类型相同.