-2

cで左シフトビットを実行しようとしています。

int a = 32;    
printf("%d\n", ~0 << a);    
printf("%d\n", ~0 << 32);    

そのため、2 つの printf() より上で実行すると、結果が異なります。私はdev-C++を使用しています。違う理由がわかりません。私を助けてください。

4

2 に答える 2

6

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

それはC標準からのものです。32 ビット幅の値で 32 ビット シフトを使用し始めると、すべての賭けがオフになります。

これはコンパイル時に完全に計算できるため、コンパイラが定数折りたたみである可能性があります。 ~0 << 32

式を定数折り畳むことはできません (常に 32 になると~0 << a判断できる非常に賢いコンパイラでない限り)。a

それが違いの原因かもしれませんが、正直なところ、プログラムがハードディスクを消去したり、CPUにミニブラックホールを作成したりするのを止める標準には何もありません(市場の反応以外)。未定義の動作は未定義です.

于 2013-04-24T03:59:45.730 に答える
0

>=(おそらく)型のビット数だけシフトしています(int使用しているシステムではおそらく32ビットです)。これは未定義の動作です。コンパイラは、必要な処理を実行するコードを発行できます。

于 2013-04-24T04:01:35.843 に答える