30

通常,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 是否损坏,或者标准是否对位移的类型提升规则做出了一些例外?

4

2 回答 2

36

所谓的常用算术转换适用于许多二元运算符,但不是全部。例如,它们不适用于位移运算符、&&、||、逗号运算符和赋值运算符。这是移位运算符的规则:

6.5.7 ... 3 语义 ...
整数提升在每个操作数上执行。结果的类型是提升的左操作数的类型。如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义。

于 2010-08-14T07:16:16.617 回答
-1

真正的麻烦在于,促销只适用于您的平台定义为int. 正如其他一些答案所述,位移运算符会将左操作数提升为 int。但是,这里 anint定义为 32 位值。整数转换不会提升为long long(64 位)。

于 2014-01-08T19:03:12.550 回答