web-dev-qa-db-ja.com

-128と128の2の補数

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

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

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

 
 unsigned 1 = 00000001 
 
すべてのビットを反転= 11111110 
 
 add 1 = 11111111 

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

 
 unsigned 128 = 10000000 
 
すべてのビットを反転= 01111111 
 
 add 1 = 10000000 
 

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

10
user720694

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

  • 0から127:128の値
  • -1から-128:128の値

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

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

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

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

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

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

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

11
Ring Ø

-128は、符号ビットの規則により、128よりも優先されます。符号付き数値表現では、最上位ビットは符号ビットと見なされます。このビットが1の場合、数値は負です。 128および-128(10000000)の表現では、このビットは1であるため、128ではなく-128を意味します。

http://en.wikipedia.org/wiki/Sign_bit を参照してください

6
Pavel Strakhov

MSBを符号ビットとして保持するため

1
Roee Gavirel