2の補数
計算例[編集]
以下に#2の補数表現における計算例を示す。補数であることの確認[編集]
例えば、4桁の二進数 00102 (= 2) に対する2の補数は 11102 である。実際、これらを足し算は以下のようになる‥引き算と補数の足し算の比較[編集]
例えば、二進数 01012 (= 5) から二進数 00112 (= 3) を引く場合、以下のように計算できる‥一方、二進数 00112 の2の補数 11012 を足す計算は、以下のようになる:
算術オーバーフローの例[編集]
足し算の結果、算術オーバーフローが起きることがある。 例えば、二進数 01012 (= 5) と二進数 00112 (= 3) の足し算は以下のように計算できる‥結果は 10002 となるが、これは2の補数表現において負の整数 −8 に対応し、通常の足し算で期待される結果 5 + 3 = 8 と一致しない。
同様に、二進数 11012 (= −3) と二進数 10102 (= −6) の足し算は期待する結果を与えない:
結果は 01112 (= 7) となり、通常の足し算で期待される結果 (−3) + (−6) = −9 と一致しない。
負の数の表現[編集]
2の補数を用いて、二進法で表された数(二進数)を負の整数に対応づけられる。2の補数の定義より、n 桁[注 4]の二進数 x とその補数 xc は以下の関係を満たす[7]:
冪 2n の倍数を 0 と同一視すれば、上記の補数の関係は 2n を法とする合同式に置き換えられる[8]:
これは x の補数 xc を x の反数 −x と見なすことを意味する。すなわち、数 y から x を引く操作は、数 y と補数 xc のたし算に置き換えられる[9][10]:
同様に反数 −x のかけ算は補数の積に置き換えられる[10]:
2の補数表現[編集]
#負の数の表現節の方法で負の数の計算を行えるが、具体的な数値計算を行うには、どの二進数(ビット列)がどの数値を表すかという対応関係を定義しなければならない。0 から 2n−1 − 1 までの非負整数をそのまま通常の位取り記数法における二進表示、
に対応づければ、これらの数の補数として負の整数に対する2の補数表現が得られる:
具体例として、n = 4 桁[注 4]の二進数における対応表を示す:
対応する数値 | 二進数 | 対応する数値 | 二進数 |
---|---|---|---|
0 | 00002 | - | - |
1 | 00012 | −1 | 11112 |
2 | 00102 | −2 | 11102 |
3 | 00112 | −3 | 11012 |
4 | 01002 | −4 | 11002 |
5 | 01012 | −5 | 10112 |
6 | 01102 | −6 | 10102 |
7 | 01112 | −7 | 10012 |
- | - | −8 | 10002 |
結局、n 桁の二進数の k + 1 桁目の値を bk ∈ {0, 1} とすれば、2の補数表現は以下のように表せる[11]:
最上位ビット bn−1 は
上記の数の補数は、以下のように表せる:
等比数列の和 を用いれば、上記の補数は以下のようにも表せる[11]:
2の補数表現の性質[編集]
符号なし整数との一致[編集]
2の補数表現は、符号ビットが 0 なら符号なし整数表現︵つまり通常の二進法︶に一致する[14]。この性質は符号・絶対値表現や1の補数表現も持っている。最小値と最大値の非対称性[編集]
2の補数表現において、n 桁︵n 個のビット︶の二進数で表せる数値の範囲は −2n−1 から +(2n−1 − 1) までである[14]︵例‥ n= 8 の場合、−27 = −128 から +(27 − 1) = +127︶。最小値と最大値の絶対値を比較すると、負の数の範囲は正の数の範囲に対して 1だけ大きく、非対称になっている。そのため、最小値の補数を求めようとすると算術オーバーフローが生じる︵汎整数拡張によって型が格上げされる場合は除く︶。この性質は符号・絶対値表現や1の補数表現にはなく、符号・絶対値表現および1の補数表現での数値の範囲は −(2n−1 − 1) から +(2n−1 − 1) までと対称的になっている。偶奇性の判定[編集]
2の補数表現において、整数の偶奇性を判定するには最下位の桁︵最下位ビット︶が偶数か奇数かを判定すればよい。すなわち二進数表示の最下位の値 b0 が 0 なら偶数であり 1なら奇数であることが示せる[14]。同じ性質は符号・絶対値表現も持つが、1の補数表現においては最上位の桁︵最上位ビット︶の検査が必要であり、最上位ビットが 1なら最下位ビットが 1、最上位ビットが 0 なら最下位ビットが 0 の場合に偶数となる。正負の判定[編集]
2の補数で表される数は、符号ビット︵最上位ビット︶ bn−1 が 0 なら非負の値を取り 1なら負の値を取る[14]。すなわち、負値か非負値かの判定は符号ビットのみから判別できる。符号・絶対値表現や1の補数表現ではゼロを表す二進数が一意でなく、符号ビットが 0 の +0 と符号ビットが 1の −0 があるため、−0 が許容される限り、これらの表現では符号ビットのみから負数か非負数かを判定できない。1の補数との関係[編集]
2の補数表現において、−1 は常にすべての位の値が 1の二進数 111...112 に対応づけられる。従って、数をビット列とみなせば、ビット列 xとそのビットを反転[注 6]させたビット列 fxは常に以下を満たす‥上記より、x の2の補数は xc = fx + 1 と表せる。従って減法は、
と書き換えられる。ビット反転はまた1の補数を得る操作でもある。
元の数とのビットの一致[編集]
x の n桁の二進数表示の下位 m− 1 桁目まで位の値が 0 だった場合、2の補数 fx+ 1 を求める際、ビット反転した値が桁上りによって再び反転するため、下位 M= min(m, n)[注 7]桁まで元の数とその2の補数の値が一致する。また残りの上位 n− M桁は、ビット反転 fxの上位 n− M桁に一致する。例えば、補数と元の数の位の値が一致する部分に下線を引けば、x = 0100 のビット反転は fx= 1011 であり、2の補数は fx+ 1 = 1100 となる。同様に、1000 および 0000 のビット反転はそれぞれ 0111, 1111 であり、2の補数はそれぞれ 1000, 0000 となる︵表も参照︶。元の数と一致する下位ビットの桁数(M) | 1 | 2 | 3 | 4 | 4 |
---|---|---|---|---|---|
元の数(x) | B3B2B11 | B3B210 | B3100 | 1000 | 0000 |
ビット反転(fx) | B3B2B10 | B3B201 | B3011 | 0111 | 1111 |
2の補数(fx + 1) | B3B2B11 | B3B210 | B3100 | 1000 | 0000 |
脚注[編集]
注釈[編集]
java.lang.Math.abs(i
nt)
などは符号付き整数型の最小値に対して引数の値をそのまま結果として与える[12]。また、組み込みの整数演算は算術オーバーフローを検出しない[13]。一方でC言語やC++において、2の補数表現による符号付き整数の最小値︵例‥INT_MIN
︶に単項マイナス演算子を作用させる︵例‥-INT_MIN
︶と、汎整数拡張により結果の型がオペランドの型より大きくなる場合を除き、算術オーバーフローが発生する。符号付き整数の算術オーバーフローは未定義動作を引き起こす。算術オーバーフローの例に関しては例えば INT32-C を参照。
(六)^ ここでビット反転とは各ビットに対する否定演算を指す。すなわち入力が 0 なら 1を出力し、入力が 1なら 0 を出力する。
(七)^ min はここで、与えられた数の中で最小の数を表す。
(八)^ 上位ビットの Bは任意の値を表す。また、B は Bのビット反転である。下線で示す部分は元の数と対応する2の補数で一致する下位ビットの範囲を示している。
出典[編集]
- ^ JIS X 0005:2002 2002, 05.08.04 2の補数.
- ^ ISO/IEC 2382:2015 2015, 2. Terms and definition. 2121100. twos complement.
- ^ JIS X 0005:2002 2002, 05.08.02 基数の補数.
- ^ ISO/IEC 2382:2015 2015, 2. Terms and definition. 2121098. radix complement.
- ^ JIS X 0005:2002 2002, 05.08.01 補数.
- ^ ISO/IEC 2382:2015 2015, 2. Terms and definition. 2121097. complement.
- ^ 水谷『数の補数表現』, pp. 2–3, 2.2 符号ビットと 2 の補数.
- ^ 西村『論理(スイッチング)回路と計算』, p. 14, 2の補数表現でなぜうまく行くのか?.
- ^ 水谷『数の補数表現』, p. 2, 2.1 補数.
- ^ a b 中野『代数入門』, p. 18, 5.1 合同式, 命題5.2.
- ^ a b 水谷『数の補数表現』, p. 3, 2.2 符号ビットと 2 の補数.
- ^ Java SE & JDK API Specification, java.lang.Math#abs(int).
- ^ Java Language Specification, 4.2.2. Integer Operations.
- ^ a b c d 西村『論理(スイッチング)回路と計算』, p. 18, 2の補数表現の性質.