私はいくつかの C コードをスリングしており、32 ビット int を 32 ビット左にビットシフトする必要があります。パラメータ n = 0 を指定してこのコードを実行すると、シフトは発生しません。
int x = 0xFFFFFFFF;
int y = x << (32 - n);
なぜこれが機能しないのですか?
あなた自身の危険でシフトしてください。標準では、やりたいことは未定義の動作です。
C99 §6.5.7
3 - 各オペランドで整数昇格が実行されます。結果の型は、昇格された左オペランドの型です。右オペランドの値が負であるか、プロモートされた左オペランドの幅以上である場合、動作は未定義です。
言い換えれば、32 ビット値を 31 ビット以上または負の数だけシフトしようとすると、結果は未定義になります。
C89 (?) 標準のドラフトのセクション3.3.7 Bitwise shift operatorによると:
右オペランドの値が負であるか、プロモートされた左オペランドのビット幅以上である場合、動作は未定義です。
int
コードをコンパイルしているシステムで が 32 ビットであると仮定すると、n
が 0 の場合、32 ビットをシフトしています。上記のステートメントによると、あなたのコードはundefined behaviorになります。