通常,C 要求将二元运算符的操作数提升为更高级别操作数的类型。这可以用来避免用冗长的强制转换填充代码,例如:
if (x-48U<10) ...
y = x+0ULL << 40;
等等
但是,我发现,至少对于 gcc,这种行为不适用于位移。IE
int x = 1;
unsigned long long y = x << 32ULL;
我希望右手操作数的类型会导致左手操作数被提升为unsigned long long
以便移位成功。但是,gcc 会打印一个警告:
warning: left shift count >= width of type
gcc 是否损坏,或者标准是否对位移的类型提升规则做出了一些例外?