10

次のコードを検討してください。

int i = 3 << 65;

結果はですi==0が、実際の結果はi==6です。いくつかのテストで、私は次のコードでそれを見つけました:

int i, s;
int a = i << s;
int b = i << (s & 31);

aとの値bは常に同じです。

C標準は、32ビット(タイプの幅)を超えるシフトについて何かを述べていますか、intそれともこの不特定の動作ですか?

4

1 に答える 1

16

私のWG12/N1124ドラフト(標準ではありませんが、Good Enough For Me)から、6.5.7ビット単位シフト演算子に次のブロックがあります。

右のオペランドの値が負であるか、プロモートされた左のオペランドの幅以上の場合、動作は未定義です。

したがって、未定義です。気をつけて。

于 2012-06-30T00:35:12.230 に答える