12

2 の補数では、0 ~ 127 は 00000000 ~ 01111111 として表されます。負の数の場合、符号なし表現のすべてのビットを反転し、1 を加算して 2 の補数を取得します。

(参照: http://en.wikipedia.org/wiki/Signed_number_representations#Two.27s_complement )

したがって、2 の補数の -1 は次のようになります。

 符号なし 1 = 00000001

 すべてのビットを反転 = 11111110

 1 を追加 = 11111111

ただし、-128 の場合、同じ手順に従うと、次のようになります。

 符号なし 128 = 10000000

 すべてのビットを反転 = 01111111

 1を追加= 10000000

-128 と 128 は 2 の補数表記で同じ表現をしていますか? 8 ビットの 2 の補数の範囲が -127 ~ 128 ではないのはなぜですか? 要するに、同じビット数を使用して符号なし 128 を表すよりも -128 が好まれるのはなぜですか?

4

3 に答える 3

12

符号付きバイトに「128」はありません。範囲は

  • 0~127:128値
  • -1 ~ -128 : 128 個の値

合計 256 個の値、つまり 2^8。

コメントに基づく補遺(および質問の再読)

0x80-128 または +128 と見なされた可能性があります。ウィキペディアの説明は読む価値があります

範囲内の最小数の 2 の補数は、その数を否定する望ましい効果をもたらしません。

たとえば、8 ビット システムの -128 の 2 の補数は、同じ 2 進数になります。これは、128 の正の値を 8 ビットの符号付き 2 進数で表すことができないためです。これは、最上位ビットへのキャリーがあったがアウトではないため、オーバーフロー状態として検出されることに注意してください。これは、絶対値のチェックされていない実装が負の最小値の場合に負の数を返す可能性があるという予期しないバグにつながる可能性があります。C の整数関数の abs ファミリーは通常、この動作をします。これはJavaにも当てはまります。この場合、開発者は、関数の呼び出し前に最小の負の値をチェックするかどうかを決定する必要があります。

2 の補数で最も負の数は、唯一の例外であるため、「奇妙な数」と呼ばれることがあります。数は例外ですが、通常の 2 の補数システムでは有効な数です。すべての算術演算は、オペランドとしても (オーバーフローがなければ) 結果としても機能します。

さらに、符号付き整数を右シフトすると、CPU は MSb (ビット 7) を右に伝播します。これは、+128 の場合、単純な論理に反します0x80。1 回のシフトだけで0xC0どちらが負の数になるか ( -64)... (正の数からの右シフトは、通常、負の結果を生成することはありません)。

于 2013-06-09T08:03:22.647 に答える