0

重複の可能性:
負のシフト カウントによる左シフト

私のコードが続くと考えてください

int main()
{
    int k=1;
    k=k<<-1;
    printf("%d",k);
}

o/p

-2147483648

出力がこのようになる理由.負の数が格納されていることは知って2's complementいますが、-2 の補数の概念が使用されています.親切にアイデアを教えてください.

4

3 に答える 3

3

k << -1; // Before the OP edit

k = k<<-1;

これらのステートメントは、C では未定義の動作です。

ビットごとの左または右シフト演算子の右オペランドで負の値を使用することは、C では未定義の動作です (C99、6.5.7 を参照)。

于 2012-10-15T12:11:22.543 に答える
2

-2147483648 という結果の理由 (x86 プロセッサでこれをテストしている場合) は、シフト カウントが 31 に固定されるためです (「Intel Architecture Software Developer's Manual Volume 2: Instruction Set Reference」を参照)。したがって、0x80000000 に等しい 1<<31 が得られます。これを符号付き 32 ビット整数として出力すると、-2147483648 になります。

于 2012-10-15T12:18:38.010 に答える
1

2 番目のオペランドが負の場合、シフト演算の結果は未定義です。

http://msdn.microsoft.com/en-us/library/f96c63ed%28v=vs.80%29.aspx
負の値でビットシフトする奇妙な結果が得られるのはなぜですか?

于 2012-10-15T12:12:15.287 に答える