重複の可能性:
負のシフト カウントによる左シフト
私のコードが続くと考えてください
int main()
{
int k=1;
k=k<<-1;
printf("%d",k);
}
o/p
-2147483648
出力がこのようになる理由.負の数が格納されていることは知って2's complement
いますが、-2 の補数の概念が使用されています.親切にアイデアを教えてください.
重複の可能性:
負のシフト カウントによる左シフト
私のコードが続くと考えてください
int main()
{
int k=1;
k=k<<-1;
printf("%d",k);
}
o/p
-2147483648
出力がこのようになる理由.負の数が格納されていることは知って2's complement
いますが、-2 の補数の概念が使用されています.親切にアイデアを教えてください.
k << -1; // Before the OP edit
と
k = k<<-1;
これらのステートメントは、C では未定義の動作です。
ビットごとの左または右シフト演算子の右オペランドで負の値を使用することは、C では未定義の動作です (C99、6.5.7 を参照)。
-2147483648 という結果の理由 (x86 プロセッサでこれをテストしている場合) は、シフト カウントが 31 に固定されるためです (「Intel Architecture Software Developer's Manual Volume 2: Instruction Set Reference」を参照)。したがって、0x80000000 に等しい 1<<31 が得られます。これを符号付き 32 ビット整数として出力すると、-2147483648 になります。
2 番目のオペランドが負の場合、シフト演算の結果は未定義です。
http://msdn.microsoft.com/en-us/library/f96c63ed%28v=vs.80%29.aspx
負の値でビットシフトする奇妙な結果が得られるのはなぜですか?