重複の可能性:
右シフト演算子の奇妙な動作
こんにちは
この関数の両方の数値が同じように出力されるのはなぜですか? 巡回シフトではありません。
unsigned int i=0x89878685;
int main()
{
printf("0x%x\n", i);
printf("0x%x\n", i>>32);
}
$ ./a.out
0x89878685
0x89878685
すべてのコンパイラがこのように動作しますか?
重複の可能性:
右シフト演算子の奇妙な動作
こんにちは
この関数の両方の数値が同じように出力されるのはなぜですか? 巡回シフトではありません。
unsigned int i=0x89878685;
int main()
{
printf("0x%x\n", i);
printf("0x%x\n", i>>32);
}
$ ./a.out
0x89878685
0x89878685
すべてのコンパイラがこのように動作しますか?
32 ビット整数を 32 ビットシフトすることは未定義の動作です。結果は予測できません。
C および C++ では、整数にN
ビットが含まれる場合、シフトできるN
ビット数はそれ以下です。シフトN
以上の場合、動作は未定義です。
実際には、32 ビット整数をシフトする場合、一部のプラットフォームでは、シフト カウントを単純に 5 ビット値として解釈します (下位 5 より上のビットは破棄します)。つまり、32
と同じように解釈され0
ます。これは明らかに、あなたのプラットフォームで起こっていることです。値はまったくシフトされません。