30

通常、Cでは、二項演算子のオペランドを上位のオペランドのタイプにプロモートする必要があります。これを悪用して、コードに冗長なキャストを入力しないようにすることができます。次に例を示します。

if (x-48U<10) ...
y = x+0ULL << 40;

ただし、少なくともgccでは、この動作はビットシフトでは機能しないことがわかりました。つまり

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に昇格させます。ただし、ここでintは、は32ビット値として定義されています。long long整数変換は(64ビット)に昇格しません。

于 2014-01-08T19:03:12.550 に答える