10

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

如果其中一个是 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 有问题还是我的逻辑有缺陷?

4

1 回答 1

15

移位不执行所谓的“通常的算术转换”,这是您引用的规则。他们只进行积分促销。移位的结果与提升的左操作数的类型相同

于 2017-08-15T18:03:15.047 回答