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が優先されるのはなぜですか?
符号付きバイトに「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)...(正の数値から右シフトすると、通常、決してが負の結果を生成することはありません)。
-128は、符号ビットの規則により、128よりも優先されます。符号付き数値表現では、最上位ビットは符号ビットと見なされます。このビットが1の場合、数値は負です。 128および-128(10000000)の表現では、このビットは1であるため、128ではなく-128を意味します。
http://en.wikipedia.org/wiki/Sign_bit を参照してください
MSBを符号ビットとして保持するため