自分の補数
2進数の1の補数は、数値の2進表現のすべてのビットを反転することで得られる値として定義されます(1を0に、またはその逆を入れ替えます)。数の1の補数は、一部の算術演算で元の数の負のように動作します。 (-1の)定数内では、1の補数は2進加算の元の数の負のように動作します。ただし、2の補数とは異なり、これらの数値は、-1のオフセット、ゼロを否定すると明確な負のゼロビットパターン、算術借入などの単純さなどの問題のため、広く使用されていません。
1 の補数システムまたは1の補数演算は、負の数が、対応する正の数のバイナリ表現の逆数で表されるシステムです。このようなシステムでは、1の補数を計算することにより、数値は否定されます(正から負、またはその逆に変換されます)。 Nビットの1の補数の数値システムは、-(2N-1-1)から2N-1-1の範囲の整数のみを表すことができますが、2の補数は-2N-1から2N-1-1を表すことができます。
1の補数の2進数システムは、整数値のビット補数が値の負の算術であることによって特徴付けられます。つまり、数値のすべてのビット(論理補数)を反転すると、0から値を減算するのと同じ結果が生成されます。
CDC 6600、LINC、PDP-1、およびUNIVAC 1107を含む多くの初期のコンピューターは、補数表記を使用していました。 CDC 6600の後継者は1980年代後半まで1の補数を使用し続け、UNIVAC 1107(UNIVAC 1100/2200シリーズ)の子孫は現在も使用していますが、現代のコンピューターの大半は2の補数を使用しています。
数値表現
正数は、2の補数と符号の大きさで使用される同じ単純なバイナリシステムです。負の値は、対応する正の値のビット補数です。最大の正の値は、符号(上位)ビットがオフ(0)であり、他のすべてのビットがオン(1)であることによって特徴付けられます。負の最小値は、符号ビットが1であり、他のすべてのビットが0であることで特徴付けられます。次の表は、4ビットシステムで可能なすべての値(-7〜+7)を示しています。
+ − 0 0000 1111 —ゼロをテストすると+0と−0の両方がTRUEを返すことに注意してください1 0001 1110 —ゼロ以外をテストするとFALSEを返します。 2 0010 1101 3 0011 1100 4 0100 1011 5 0101 1010 6 0110 1001 7 0111 1000基礎
2つの値を追加するのは簡単です。最下位ビットの値を揃えて追加し、キャリーを1つ左のビットに伝搬します。キャリーが単語の末尾を超えて延びる場合、「ラップアラウンド」したと言われ、「エンドアラウンドキャリー」と呼ばれる状態です。この場合、ビットは右端のビットに追加し直す必要があります。この現象は、2の補数演算では発生しません。
0001 0110 22 + 0000 0011 3 ================ 0001 1001 25減算は似ていますが、キャリーではなくボローが左に伝播される点が異なります。ボローが単語の終わりを超えて広がる場合、それは「ラップアラウンド」したと言われ、「 エンドアラウンドボロー 」と呼ばれる状態です。この場合、ビットは右端のビットから減算する必要があります。この現象は、2の補数演算では発生しません。
0000 0110 6 − 0001 0011 19 =========== ==== 1 1111 0011 −12 —エンドアラウンドボローが生成され、中間結果の符号ビットは1です。− 0000 0001 1-結果からエンドアラウンド借入を引きます。 =========== ==== 1111 0010 −13 —正しい結果(6 − 19 = -13)正の値のビット補数が正の値の負の大きさであることを示すのは簡単です。 19 + 3の計算では、19-(-3)と同じ結果が生成されます。
3から19を追加します。
0001 0011 19 + 0000 0011 3 =============== 0001 0110 2219から-3を引きます。
0001 0011 19 − 1111 1100 −3 =========== ==== 1 0001 0111 23 —エンドアラウンド借入が生成されます。 − 0000 0001 1 —結果からアラウンドアローを減算します。 =========== ==== 0001 0110 22 —正しい結果(19 −(−3)= 22)。負のゼロ
負のゼロは、符号付きワードのすべてのビットが1である条件です。これは、左端のビットが1の場合に値が負であり、負の数が数の絶対値のビット補数であるという1の補数規則に従います。値は、計算時にゼロとしても動作します。別の値との間で負のゼロを加算または減算すると、元の値が生成されます。
負のゼロを追加する:
0001 0110 22 + 1111 1111 -0 =========== ==== 1 0001 0101 21エンドアラウンドキャリーが生成されます。 + 0000 0001 1 =========== ==== 0001 0110 22正しい結果(22 +(−0)= 22)負のゼロを引く:
0001 0110 22 − 1111 1111 −0 =========== ==== 1 0001 0111 23エンドアラウンド借入が生成されます。 − 0000 0001 1 =========== ==== 0001 0110 22正しい結果(22 −(−0)= 22)負のゼロは、1の補数加算器で簡単に生成されます。同じ大きさの正と負を単に追加します。
0001 0110 22 + 1110 1001 −22 =========== ==== 1111 1111 −0負のゼロ。数学は常に正しい結果を生成しますが、負のゼロの副作用は、ソフトウェアが負のゼロをテストする必要があることです。
負のゼロを避ける
負のゼロの生成は、加算が減算器で達成される場合は問題になりません。最初のオペランドは変更されずに減算に渡され、2番目のオペランドは補完され、減算は負のゼロを避けて正しい結果を生成します。前の例では、22と-22が追加され、-0が生成されました。
0001 0110 22 0001 0110 22 1110 1001 −22 1110 1001 −22 + 1110 1001 −22 − 0001 0110 22 + 0001 0110 22 − 1110 1001 −22 =========== ==== but == ========= ====同様に、==============しかし============== 1111 1111 -0 0000 0000 0 1111 1111 −0 0000 0000 0「コーナーケース」は、一方または両方のオペランドがゼロおよび/または負のゼロの場合に発生します。
0001 0010 18 0001 0010 18-0000 0000 0-1111 1111 -0 =========== ==== =============== 0001 0010 18 1 0001 0011 19-0000 0001 1 =========== ==== 0001 0010 18+0の減算は簡単です(上記を参照)。 2番目のオペランドが負のゼロの場合、それは反転され、最初のオペランドの元の値が結果になります。 −0を引くことも簡単です。結果は2つのケースのうちの1つのみです。ケース1では、オペランド1は-0であるため、すべてのビット位置で1から1を引くだけで結果が生成されます。ケース2では、減算により、オペランド1よりも1大きい値と、エンドアラウンドボローが生成されます。ボローを完了すると、オペランド1と同じ値が生成されます。
次の例は、両方のオペランドがプラスまたはマイナスのゼロの場合に何が起こるかを示しています。
0000 0000 0 0000 0000 0 1111 1111 -0 1111 1111 -0 + 0000 0000 0 + 1111 1111 -0 + 0000 0000 0 + 1111 1111 -0 ========== ======= ======== ==== =========== =============== ==== 0000 0000 0 1111 1111 -0 1111 1111 -0 1 1111 1110 -1 + 0000 0001 1 ================== 1111 1111 -0 0000 0000 0 0000 0000 0 1111 1111 -0 1111 1111 -0-1111 1111 -0-0000 0000 0-1111 1111 -0-0000 0000 0 =========== ==== ================== ======= ==== =========== ==== 1 0000 0001 1 0000 0000 0 0000 0000 0 1111 1111 -0-0000 0001 1 ====== ===== ==== 0000 0000 0この例は、±0のみを加算する場合の4つの可能な条件のうち、加算器が3つの条件で-0を生成することを示しています。相補減算器は、両方のオペランドが-0の場合にのみ-0を生成します。