-5 / 2 = -2
-5 >> 1 = -3
>> 1は数値を2で割ることを先生から学びました。正の数では機能しますが、負の数では機能しません。誰かが私に説明できますか?
ありがとう
-5 / 2 = -2
-5 >> 1 = -3
>> 1は数値を2で割ることを先生から学びました。正の数では機能しますが、負の数では機能しません。誰かが私に説明できますか?
ありがとう
BЈовић&神秘的な状態として、負の数でビットシフト演算子を使用することは実装で定義されています。
この理由は、Cが論理ビットシフトと算術ビットシフトを区別しないためです。
(最上位ビットの算術パッド、0の論理パッド)
正の数の場合、これは重要ではありません。算術ビットシフトと論理ビットシフトの両方で、最上位ビットが0として保持されます。
算術5 >> 1
0000 0000 0000 0101
=5
から
0000 0000 0000 0010
=2
論理5>>1
0000 0000 0000 0101
=5
から
0000 0000 0000 0010
=2
ただし、負の数(2のカンプ)の場合
算術-5 >> 1
1111 1111 1111 1011
=-5
から
1111 1111 1111 1101
=-3
論理-5>>1
1111 1111 1111 1011
=-5
から
0111 1111 1111 1101
=32,765
または少なくとも、これは私がそれを理解する方法です
正の数では機能しますが、負の数では機能しません。
負の整数でシフト演算子を使用することは、実装で定義されています。
[expr.shift] / 3はこれを伝えます:
E1 >> E2の値は、E1の右シフトされたE2ビット位置です。E1に符号なしの型がある場合、またはE1に符号付きの型があり、負でない値がある場合、結果の値はE1/2E2の商の整数部分になります。E1の型が符号付きで負の値の場合、結果の値は実装によって定義されます。
まず、
バイナリの5は0000 0000 0000 0101ですが、-5はどうでしょうか。ここにあります :
これで、次のようになります。-5 = 1111 1111 1111 1011(2の補数形式です)
したがって、-5>>1の計算方法は次のとおりです。
答えは正しいと思います。'/'(除算)演算子として商(除算の結果)を生成します。
-5/2 = -3(quotient) and 1(remainder ).
したがって、これは正の数と負の数の両方で問題ありません。
5/2 = 2(quotient) and 1(remainder ).
したがって、正の数で問題ありません。
余りが負の数になることはありません。常に正の数です。
-5 >> 1=-3の答えだと思います。正の数、たとえば5の場合、2で除算すると、2.5が最も近い最小の整数、つまり2に丸められます。
しかし、負の数-5を考えると、2で割ると-2.5になります。最も近い整数に四捨五入すると-3になります。
cでは、右シフト演算子は符号ビットを保持します。したがって、符号ビットを保持しながらビットを右シフトすると、2つの補数形式の負の数が生成されます。