4

私はいくつかの C コードをスリングしており、32 ビット int を 32 ビット左にビットシフトする必要があります。パラメータ n = 0 を指定してこのコードを実行すると、シフトは発生しません。

int x = 0xFFFFFFFF;
int y = x << (32 - n);

なぜこれが機能しないのですか?

4

2 に答える 2

11

あなた自身の危険でシフトしてください。標準では、やりたいことは未定義の動作です。

C99 §6.5.7

3 - 各オペランドで整数昇格が実行されます。結果の型は、昇格された左オペランドの型です。右オペランドの値が負であるか、プロモートされた左オペランドの幅以上である場合、動作は未定義です。

言い換えれば、32 ビット値を 31 ビット以上または負の数だけシフトしようとすると、結果は未定義になります。

于 2013-09-14T07:23:38.440 に答える
3

C89 (?) 標準のドラフトのセクション3.3.7 Bitwise shift operatorによると:

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

intコードをコンパイルしているシステムで が 32 ビットであると仮定すると、nが 0 の場合、32 ビットをシフトしています。上記のステートメントによると、あなたのコードはundefined behaviorになります。

于 2013-09-14T07:23:28.307 に答える