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



这个问题 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 是否有错误或我的逻辑是否存在缺陷?

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

最新更新