3

重複の可能性:
右シフト演算子の奇妙な動作

こんにちは

この関数の両方の数値が同じように出力されるのはなぜですか? 巡回シフトではありません。

unsigned int i=0x89878685;
int main()
{
  printf("0x%x\n", i);
  printf("0x%x\n", i>>32);
}

$ ./a.out
0x89878685
0x89878685

すべてのコンパイラがこのように動作しますか?

4

1 に答える 1

10

32 ビット整数を 32 ビットシフトすることは未定義の動作です。結果は予測できません。

C および C++ では、整数にNビットが含まれる場合、シフトできるNビット数はそれ以下です。シフトN以上の場合、動作は未定義です。

実際には、32 ビット整数をシフトする場合、一部のプラットフォームでは、シフト カウントを単純に 5 ビット値として解釈します (下位 5 より上のビットは破棄します)。つまり、32と同じように解釈され0ます。これは明らかに、あなたのプラットフォームで起こっていることです。値はまったくシフトされません。

于 2011-04-13T14:59:02.937 に答える