cで左シフトビットを実行しようとしています。
int a = 32;
printf("%d\n", ~0 << a);
printf("%d\n", ~0 << 32);
そのため、2 つの printf() より上で実行すると、結果が異なります。私はdev-C++を使用しています。違う理由がわかりません。私を助けてください。
cで左シフトビットを実行しようとしています。
int a = 32;
printf("%d\n", ~0 << a);
printf("%d\n", ~0 << 32);
そのため、2 つの printf() より上で実行すると、結果が異なります。私はdev-C++を使用しています。違う理由がわかりません。私を助けてください。
右オペランドの値が負の値であるか、プロモートされた左オペランドの幅以上である場合、動作は未定義です。
それはC標準からのものです。32 ビット幅の値で 32 ビット シフトを使用し始めると、すべての賭けがオフになります。
これはコンパイル時に完全に計算できるため、コンパイラが定数折りたたみである可能性があります。 ~0 << 32
式を定数折り畳むことはできません (常に 32 になると~0 << a
判断できる非常に賢いコンパイラでない限り)。a
それが違いの原因かもしれませんが、正直なところ、プログラムがハードディスクを消去したり、CPUにミニブラックホールを作成したりするのを止める標準には何もありません(市場の反応以外)。未定義の動作は未定義です.
>=
(おそらく)型のビット数だけシフトしています(int
使用しているシステムではおそらく32ビットです)。これは未定義の動作です。コンパイラは、必要な処理を実行するコードを発行できます。