这个问题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是否有漏洞或我的逻辑存在缺陷?
答案 0 :(得分:15)
班次没有做所谓的“通常算术转换”,这是你引用的规则。 They only perform integral promotions。转变的结果是the same type as the promoted left operand。