int、doubleなどの最小値が正の値よりもゼロから1離れているのはなぜですか?


10

私はそれが2の補数と1の加算に関係していることを知っていますが、負の数値に関しては、同じビット数でもう1つの数値をエンコードする方法を実際には知りません。


3
これの本当に厄介な部分は、Abs(MinValue)が負であるということです。
OldFart 2013年

1
javaのDouble.MIN_VALUEは最小の正の値であり、ゼロから最も遠い(実際の)数値は等しい大きさです(適切な符号ビットがあるため)
ラチェットフリーク

回答:


16

これらの用語で考えてください。前に符号が付いた2ビットの数値をとります。

000 = 0
001 = 1
010 = 2
011 = 3

ここで、いくつかの欠点を見てみましょう。

111 = -1
110 = -2
101 = -3

ちょっと待って

100 ... 

符号ビットが1であるため、負である必要があります。したがって、論理的には-4でなければなりません。

(編集:WorldEngineerが正しく指摘しているように、すべての番号付けシステムがこのように機能するわけではありませんが、あなたが求めているものは機能します。)


11

整数の範囲には2つのクラスの数ではなく、3つのクラスがあるためです。負の数、ゼロ、正の数です。ゼロはスロットを占有する必要があります(ゼロを表現できないようにするのは実際的ではありません...)。その犠牲を払わなければならないのは通常正の範囲であるという事実はある程度恣意的ですが、ビット操作のレベルでは、この決定によってより便利になることがいくつかあります。


それは単なるビット操作ではありません。32ビット符号付き数値のセットは、31の後のすべてのビットでバイナリ表現が同じ値を持つ数値のセットであり、そのような数値の1つには、1の無限セットとそれに続く31個のゼロがあります。ゼロの無限の文字列とそれに続く単一の1と31のゼロの追加の逆数は、符号付き値に必要なパターンに適合しません。
スーパーキャット2014年

4

符号付き整数を2進数で表すには、基本的に3つの方法があります。2の補数、1の補数、および符号の大きさです。(二年生は昔、ドードー鳥の道を行きました)

1の補数と符号の大きさには2つのゼロ値+0と-0があり、それぞれ一意の表現を持っています。2の補数には、1つのゼロ値と1つの表現しかありません。

これで、Nビットのフィールドは2 ^ Nの値をエンコードできます。2の補数で1を減算すると、2 ^ N-1 = 2 ^(N-1)+ 2 ^(N-1)+ 1になります。ゼロの表現はすべてゼロビットであり、+符号はゼロであるため、符号ビットが1に設定された非ゼロ表現がもう1つあります。

これは、2の補数が-(2 ^(N-1)).. +(2 ^(N-1)-1)の範囲の値を表すという非常に長い説明です。

整数デジタル信号処理計算を行う場合、実際には1の補数は2の補数よりも優れています。1の補数演算は、本質的にゼロに切り捨てられます。2の補数は-無限大に切り捨てられます。私はこれをハードな方法で学びました...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.