0

-127 の 2 進数表現は 10000001 (補数) であることを知っています。

右に1桁シフトすると 11000000 になる理由を誰か教えてもらえますか?

(-127) = 10000001

(-127>>1) = 11000000 ???

ありがとう。

4

5 に答える 5

3

プログラミング言語が (Java のように) 符号拡張右シフトを行う場合、左端の 1 は符号拡張から得られます。つまり、最上位ビットが元の数値に設定されているため、各シフトの結果に設定されたままになります (したがって、1 を超えるシフトでは、実行されたシフト数に対応する最上位ビットにすべて 1 が含まれます)。

これは言語に依存します。IIRC C および C++ は、符号付きの値の場合は右シフトで符号拡張しますが、符号なしの値の場合は拡張しません。Java には、拡張せずにシフトする特別な >>> 演算子があります (Java では、誤解を招く名前のバイトを含め、すべての数値プリミティブ値が署名されています)。

于 2012-06-25T21:19:45.943 に答える
3

一部の言語での右シフトは、最上位ビット (この場合は1) にあるもので埋められます。これは、負の数をシフトしても符号が変化しないようにするためです。これがなければ正の数に変わります。

于 2012-06-25T21:17:43.850 に答える
2

-127 (としてエンコードされた2 の補数10000001) を 2 で割って (ゼロに向かってではなく -無限大に向かって) 切り捨てると、-64 ( としてエンコードされた 2 の補数) が得られるためです11000000

ビット単位の理由は、符号付きの値を右にシフトする場合、符号拡張を行うためです。ゼロをシフトするのではなく、最上位ビットを複製します。2 の補数の符号付き数値を扱う場合、上記のように正しい結果が保証されます。

アセンブリ言語 (およびそれらがエンコードする機械語) には通常、符号なしおよび符号付きの右シフト演算 (「論理右シフト」対「算術右シフト」とも呼ばれる) 用の個別の命令があります。およびコンパイルされた言語は通常、それぞれ符号なしおよび符号付きの値をシフトするときに適切な命令を選択します。

于 2012-06-25T21:20:43.163 に答える
2

-127 の WORD (2 バイト) は1111111110000001. これを 1 ビット右にシフトし、1 バイトとして表すと、結果は次のようになり11000000 ます。

于 2012-06-25T21:17:47.813 に答える
1

これは符号拡張であるため、右にシフトされた負の数は依然として負の数です。

于 2012-06-25T21:20:22.350 に答える