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

时间:2017-08-15 17:54:58

标签: c++ language-lawyer bit-shift integer-promotion unsigned-long-long-int

这个问题Implicit type conversion rules in C++ operators(以及其他几个)陈述

  

如果其中一个是long long unsigned int,则另一个被提升为long long   unsigned 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是否有漏洞或我的逻辑存在缺陷?

1 个答案:

答案 0 :(得分:15)

班次没有做所谓的“通常算术转换”,这是你引用的规则。 They only perform integral promotions。转变的结果是the same type as the promoted left operand