2の補数

2の補数は、2}} を位取り記数法の基数とした場合の基数の補数であるJIS X 0005:2002ISO/IEC 2382:2015JIS X 0005:2002ISO/IEC 2382:2015JIS X 0005:2002ISO/IEC 2382:2015三進法における[[補数#定義。すなわち、整数 x}} との和が基数 2}} の冪 2sup となる数 1=//x//sub のことをいうname=notation-complement。

数 x}} とその2の補数 //x//sub を二進法で表せば、2の補数 //x//sub は x}} との和が //n// + 1}} 桁に繰り上がる最小の数といえる。

2の補数を得る手順は、基数の補数および減基数の補数の定義から、1の補数に 1}} を足す操作となる。1の補数は二進表示された数の各位の値を 0}} から 1}}、また 1}} から 0}} に置き換える操作によって得られるため、2の補数はしばしば元の数をビット反転して1を足したものとして定義される。

ある数の2の補数を反数と見なせば、二進法において決まった桁数を持った数をそれぞれ非負の数と負の数に対応づけられる。 特に n}} 桁の二進数について 0}} から 2supの範囲で符号なし表現と一致させたものは2の補数表現または2の補数表記と呼ばれる。

2の補数表現はコンピュータの分野において、固定長の符号付きの整数型や固定小数点数の表現に利用されている。

また2の補数表現は加算器で減算をするために使われる。

1. 計算例
------

以下に#2の補数表現における計算例を示す。

1.1. 補数であることの確認
---------------

例えば、4桁の二進数 1=0010sub に対する2の補数は 1110sub である。実際、これらを足し算は以下のようになる：

結果は 1=10000sub になっており、1110sub が 0010sub の 1=10000sub に対する補数になっていることが確かめられる。また5桁目以降を無視し下4桁だけ取り出せば、結果は 0000sub となる。つまり、0010sub にその2の補数 1110sub を足すということは 0010}} から 0010}} 自身を引くということと同じ意味を持つ。言い換えれば、 1110sub は負数 −2}} を表している。

1.2. 引き算と補数の足し算の比較
------------------

例えば、二進数 1=0101sub から二進数 1=0011sub を引く場合、以下のように計算できる：

一方、二進数 0011sub の2の補数 1101sub を足す計算は、以下のようになる：

5桁目以降を無視し下4桁を取り出せば、こちらも結果は 1=0010sub になり、引き算の場合と一致する。また、1101sub は負数 −3}} を表していることが分かる。

1.3. 算術オーバーフローの例
----------------

足し算の結果、算術オーバーフローが起きることがある。

例えば、二進数 1=0101sub と二進数 1=0011sub の足し算は以下のように計算できる：

結果は 1=1000sub となるが、これは2の補数表現において負の整数 −8}} に対応し、通常の足し算で期待される結果 1=5 + 3 = 8}} と一致しない。

同様に、二進数 1=1101sub と二進数 1=1010sub の足し算は期待する結果を与えない：

結果は 1=0111sub となり、通常の足し算で期待される結果 1= +  = −9}} と一致しない。

2. 負の数の表現
---------

2の補数を用いて、二進法で表された数を負の整数に対応づけられる。2の補数の定義より、n}} 桁name=digitsの二進数 x}} とその補数 //x//sub は以下の関係を満たす水谷『数の補数表現』：

冪 2sup の倍数を 0}} と同一視すれば、上記の補数の関係は 2sup を法とする合同式に置き換えられる西村『論理回路と計算』：

これは x}} の補数 //x//sub を x}} の反数 −//x//}} と見なすことを意味する。すなわち、数 y}} から x}} を引く操作は、数 y}} と補数 //x//sub のたし算に置き換えられる水谷『数の補数表現』中野『代数入門』：

同様に反数 −//x//}} のかけ算は補数の積に置き換えられる中野『代数入門』：

3. 2の補数表現
---------

#負の数の表現節の方法で負の数の計算を行えるが、具体的な数値計算を行うには、どの二進数がどの数値を表すかという対応関係を定義しなければならない。0}} から 2sup までの非負整数をそのまま通常の位取り記数法における二進表示、

に対応づければ、これらの数の補数として負の整数に対する2の補数表現が得られる：

具体例として、1=//n// = 4}} 桁name=digits}}の二進数における対応表を示す：

結局、n}} 桁の二進数の 1=//k// + 1}} 桁目の値を //bsub とすれば、2の補数表現は以下のように表せる水谷『数の補数表現』：//

最上位ビット //b//sub は符号ビットと呼ばれ、数値の正負を決定する。すなわち、符号ビットが 0}} なら非負の数値を表し、1}} なら負の数値を表す。

上記の数の補数は、以下のように表せる：

等比数列の和 を用いれば、上記の補数は以下のようにも表せる水谷『数の補数表現』：

これは結局、元の数に負符号を付けた形となっている。

4. 2の補数表現の性質
------------

4.1. 符号なし整数との一致
---------------

2の補数表現は、符号ビットが 0}} なら符号なし整数表現に一致する西村『論理回路と計算』。この性質は符号・絶対値表現や1の補数表現も持っている。

4.2. 最小値と最大値の非対称性
-----------------

2の補数表現において、n}} 桁の二進数で表せる数値の範囲は −2sup から +(2sup までである西村『論理回路と計算』。最小値と最大値の絶対値を比較すると、負の数の範囲は正の数の範囲に対して 1}} だけ大きく、非対称になっている。そのため、最小値の補数を求めようとすると算術オーバーフローが生じる。この性質は符号・絶対値表現や1の補数表現にはなく、符号・絶対値表現および1の補数表現での数値の範囲は −(2sup から +(2sup までと対称的になっている。

4.3. 偶奇性の判定
-----------

2の補数表現において、整数の偶奇性を判定するには最下位の桁が偶数か奇数かを判定すればよい。すなわち二進数表示の最下位の値 //b//sub が 0}} なら偶数であり 1}} なら奇数であることが示せる西村『論理回路と計算』。同じ性質は符号・絶対値表現も持つが、1の補数表現においては最上位の桁の検査が必要であり、最上位ビットが 1}} なら最下位ビットが 1}}、最上位ビットが 0}} なら最下位ビットが 0}} の場合に偶数となる。

4.4. 正負の判定
----------

2の補数で表される数は、符号ビット //b//sub が 0}} なら非負の値を取り 1}} なら負の値を取る西村『論理回路と計算』。すなわち、負値か非負値かの判定は符号ビットのみから判別できる。符号・絶対値表現や1の補数表現ではゼロを表す二進数が一意でなく、符号ビットが 0}} の +0}} と符号ビットが 1}} の −0}} があるため、−0}} が許容される限り、これらの表現では符号ビットのみから負数か非負数かを判定できない。

4.5. 1の補数との関係
-------------

2の補数表現において、−1}} は常にすべての位の値が 1}} の二進数 111...11sub に対応づけられる。従って、数をビット列とみなせば、ビット列 x}} とそのビットを反転ここで[[ビット演算#NOTさせたビット列 sup は常に以下を満たす：

上記より、x}} の2の補数は 1=//x//sub と表せる。従って減法は、

と書き換えられる。ビット反転はまた1の補数を得る操作でもある。

右辺の 1=(2sup は x}} に対する1の補数そのものであるから、ビット反転は1の補数を得る操作になっている。

4.6. 元の数とのビットの一致
----------------

x}} の n}} 桁の二進数表示の下位 //m// − 1}} 桁目まで位の値が 0}} だった場合、2の補数 sup を求める際、ビット反転した値が桁上りによって再び反転するため、下位 1=//M// = min}}math桁まで元の数とその2の補数の値が一致する。また残りの上位 //n// − //M//}} 桁は、ビット反転 sup の上位 //n// − //M//}} 桁に一致する。例えば、補数と元の数の位の値が一致する部分に下線を引けば、1=//x// = 0underline のビット反転は 1=sup であり、2の補数は 1=sup となる。同様に、underline および underline のビット反転はそれぞれ underline, underline であり、2の補数はそれぞれ underline, underline となる。



5. 脚注
-----

5.1. 注釈
-------

5.2. 出典
-------

6. 参考文献
-------

7. 関連項目
-------

符号付数値表現
コンピュータの数値表現
補数
1の補数
整数型
ブースの乗算アルゴリズム