3

StackOverflowでまだカバーされていないと思う特定のCビットシフトシナリオがあります。(もしそうなら、私はそれを見つけることができませんでした!)

この演習ではsigned int、データ型としてsを使用しています。

値を取得します0x80000000(最上位ビットの1にすぎません)。

算術右シフトを使用して、マシン上で1回右シフトします(私の場合はそうです)。

結果= 0xC0000000(左端のバイトで1100 0000)。

それをシフトし続けると、左から右に、ものでいっぱいになるはずです。

結果= 0xFFFFFFFF(すべてのもの。)

ただし 、同じ例を試してみてください。ただし、1つ余分な位置をすべて一緒にシフトします。

0x80000000 >> 0x00000020(右シフト32回)

あなたの結果は?知らない。私の結果はすべてのものではありませんでした。実際、私は0x00000001それが私の望ましい行動ではなかったと思いました。どうしてこれなの?マシン固有ですか?

(コンテキスト:パズルを解くために私の操作を数ビット演算子に制限する宿題の割り当て。これはパズルの側面ですが、質問全体からはほど遠いです。)

4

4 に答える 4

6

未定義の動作です

32ビット整数の左ビットシフト「<<」が32回以上使用された場合、期待どおりに機能しないのはなぜですか。

つまり、疫病のようにそれを避けるべきだということです。「すべてのCプログラマーが未定義動作について知っておくべきこと」を含むいくつかのリンクがあります:http://lwn.net/Articles/511767/

于 2012-08-27T16:21:17.397 に答える
5

オペランドのビット数だけシフトすると、未定義の動作が発生するため、「予期しない」結果が得られます。

于 2012-08-27T16:17:02.313 に答える
2

これについては、C99標準からの引用です。

6.5.7ビット単位のシフト演算子[...]

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

元のソースへのクレジット付き。

于 2012-08-27T16:20:15.277 に答える
1

幅を超えて値をシフトすることはできません。整数のwithはいくらですか?ええと、32ビットシステムでは32ビットです。gccが32を超えるintをシフトしようとすると、次の警告が表示されます。

warning: right shift count >= width of type [enabled by default]

取得したい場合0xFFFFFFFFは、32回ではなく、31回シフトする必要があります。考えてみてください!

于 2012-08-27T16:26:23.513 に答える