2の補数

は、 を位取り記数法の基数とした場合の基数の補数である。すなわち、整数  との和が基数  の冪  となる数  のことをいう（例： について、 に対応する2の補数は ）。

数  とその2の補数  を二進法で表せば、2の補数  は  との和が  桁に繰り上がる最小の数といえる（例： について、 に対応する2の補数は ）。

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

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

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

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

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

### 補数であることの確認
例えば、4桁の二進数  に対する2の補数は  である。実際、これらを足し算は以下のようになる：
:
\begin{array}{lrrrrr}
        &   & 0 & 0 & 1 & 0 \\
  {}+{} &   & 1 & 1 & 1 & 0 \\
  \hline
        & \cancel{1} & 0 & 0 & 0 & 0
\end{array}

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

### 引き算と補数の足し算の比較

例えば、二進数  から二進数  を引く場合、以下のように計算できる：
:
\begin{array}{lrrrrr}
        &   & 0 & 1 & 0 & 1 \\
  {}-{} &   & 0 & 0 & 1 & 1 \\
  \hline
        &   & 0 & 0 & 1 & 0
\end{array}


一方、二進数  の2の補数  を足す計算は、以下のようになる：
:
\begin{array}{lrrrrr}
        &   & 0 & 1 & 0 & 1 \\
  {}+{} &   & 1 & 1 & 0 & 1 \\
  \hline
        & \cancel{1} & 0 & 0 & 1 & 0
\end{array}

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

### 算術オーバーフローの例

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

例えば、二進数  と二進数  の足し算は以下のように計算できる：
:
\begin{array}{lrrrrr}
        &   & 0 & 1 & 0 & 1 \\
  {}+{} &   & 0 & 0 & 1 & 1 \\
  \hline
        &   & 1 & 0 & 0 & 0
\end{array}

結果は  となるが、これは2の補数表現において負の整数  に対応し、通常の足し算で期待される結果  と一致しない。

同様に、二進数  と二進数  の足し算は期待する結果を与えない：
:
\begin{array}{lrrrrr}
        &   & 1 & 1 & 0 & 1 \\
  {}+{} &   & 1 & 0 & 1 & 0 \\
  \hline
        & \cancel{1} & 0 & 1 & 1 & 1
\end{array}

結果は  となり、通常の足し算で期待される結果  と一致しない。

## 負の数の表現
2の補数を用いて、二進法で表された数（二進数）を負の整数に対応づけられる。2の補数の定義より、 桁の二進数  とその補数  は以下の関係を満たす：
:
  x + x_\mathrm{c} = 2^n
  \quad(\iff
  x_\mathrm{c} = 2^n - x
  )\,.

冪  の倍数を  と同一視すれば、上記の補数の関係は  を法とする合同式に置き換えられる：
:
  x + x_\mathrm{c} \equiv 0 \pmod {2^n} \,.

これは  の補数  を  の反数  と見なすことを意味する。すなわち、数  から  を引く操作は、数  と補数  のたし算に置き換えられる：
:
  y - x 
  \equiv y + 2^n - x 
  \equiv y + x_\mathrm{c} \pmod {2^n} \,.

同様に反数  のかけ算は補数の積に置き換えられる：
:
  y \cdot (- x) 
  \equiv y \cdot 2^n + y \cdot (- x) 
  \equiv y \cdot x_\mathrm{c} \pmod {2^n} \,.


## 
#負の数の表現節の方法で負の数の計算を行えるが、具体的な数値計算を行うには、どの二進数（ビット列）がどの数値を表すかという対応関係を定義しなければならない。 から  までの非負整数をそのまま通常の位取り記数法における二進表示、
: 
  \begin{align}
  0 &\mapsto 0_2, \\
  1 &\mapsto 1_2, \\
  2 &\mapsto {10}_2, \\
  & \;\; \vdots \\
  2^{n-1}-2 &\mapsto
    {011\cdots10}_2, \\
  2^{n-1}-1 &\mapsto
    \underbrace{011\cdots11}_{n \text{桁}}{}_{2}
  \end{align}

に対応づければ、これらの数の補数として負の整数に対する2の補数表現が得られる：
: 
  \begin{alignat}{2}
  2^{n-1} &\equiv -2^{n-1} 
    &&\mapsto {100 \cdots 00}_2, \\
  2^{n-1} + 1 &\equiv 1 - 2^{n-1}
    &&\mapsto {100 \cdots 01}_2, \\
    & \;\; \vdots && \;\; \vdots \\
  2^{n} - 2 &\equiv -2
    &&\mapsto {111 \cdots 10}_2, \\
  2^{n} - 1 &\equiv -1
    &&\mapsto {111 \cdots 11}_2 
  \,.
  \end{alignat}


具体例として、 桁の二進数における対応表を示す：

結局、 桁の二進数の  桁目の値を  とすれば、2の補数表現は以下のように表せる：
: 
  {b_{n-1} b_{n-2} \cdots b_1 b_0}_{(2)}
  \mapsto
  - b_{n-1} \cdot 2^{n-1}
  + \sum_{k=0}^{n-2} {b_k \cdot 2^k}
   \,.

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

上記の数の補数は、以下のように表せる：
: 
  \left({b_{n-1} b_{n-2} \cdots b_1 b_0}_{(2)}\right)_\mathrm{c}
  \mapsto 
  1 
  - (1 - b_{n-1})\cdot 2^{n-1}
  + \sum_{k=0}^{n-2} {(1 - b_k) \cdot 2^k}
   \,.

等比数列の和  \sum_{k=0}^{n-2} 2^k = 2^{n-1} - 1 を用いれば、上記の補数は以下のようにも表せる：
: 
  \left({b_{n-1} b_{n-2} \cdots b_1 b_0}_{(2)}\right)_\mathrm{c}
  \mapsto 
  b_{n-1} \cdot 2^{n-1}
  - \sum_{k=0}^{n-2} {b_k \cdot 2^k}
   \,.

これは結局、元の数に負符号を付けた形となっている（ただし元の数が  の場合は算術オーバーフローが発生する。オーバーフローをチェックせずラップアラウンドする場合、 自身へ写る）。

## 2の補数表現の性質
### 符号なし整数との一致

2の補数表現は、符号ビットが  なら符号なし整数表現（つまり通常の二進法）に一致する。この性質は符号・絶対値表現や1の補数表現も持っている。

### 最小値と最大値の非対称性
2の補数表現において、 桁（ 個のビット）の二進数で表せる数値の範囲は  から  までである（例：  の場合、 から ）。最小値と最大値の絶対値を比較すると、負の数の範囲は正の数の範囲に対して  だけ大きく、非対称になっている。そのため、最小値の補数を求めようとすると算術オーバーフローが生じる（汎整数拡張によって型が格上げされる場合は除く）。この性質は符号・絶対値表現や1の補数表現にはなく、符号・絶対値表現および1の補数表現での数値の範囲は  から  までと対称的になっている。

### 偶奇性の判定

2の補数表現において、整数の偶奇性を判定するには最下位の桁（最下位ビット）が偶数か奇数かを判定すればよい。すなわち二進数表示の最下位の値  が  なら偶数であり  なら奇数であることが示せる。同じ性質は符号・絶対値表現も持つが、1の補数表現においては最上位の桁（最上位ビット）の検査が必要であり、最上位ビットが  なら最下位ビットが 、最上位ビットが  なら最下位ビットが  の場合に偶数となる。

### 正負の判定

2の補数で表される数は、符号ビット（最上位ビット）  が  なら非負の値を取り  なら負の値を取る。すなわち、負値か非負値かの判定は符号ビットのみから判別できる。符号・絶対値表現や1の補数表現ではゼロを表す二進数が一意でなく、符号ビットが  の  と符号ビットが  の  があるため、 が許容される限り、これらの表現では符号ビットのみから負数か非負数かを判定できない。

### 1の補数との関係

2の補数表現において、 は常にすべての位の値が  の二進数  に対応づけられる。従って、数をビット列とみなせば、ビット列  とそのビットを反転させたビット列  は常に以下を満たす：
: 
  x + {}^\mathrm{f}x \equiv -1 \pmod{2^n} \,.

上記より、 の2の補数は  と表せる。従って減法は、
:
  y - x \equiv y + {}^\mathrm{f}x + 1 \pmod{2^n}

と書き換えられる。ビット反転はまた1の補数を得る操作でもある。
: 
  {}^\mathrm{f}x
  \equiv -1 - x
  \equiv \left(2^n - 1\right) - x
  \pmod{2^n} \,.

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

### 元の数とのビットの一致

 の  桁の二進数表示の下位  桁目まで位の値が  だった場合、2の補数  を求める際、ビット反転した値が桁上りによって再び反転するため、下位 桁まで元の数とその2の補数の値が一致する。また残りの上位  桁は、ビット反転  の上位  桁に一致する。例えば、補数と元の数の位の値が一致する部分に下線を引けば、 のビット反転は  であり、2の補数は  となる。同様に、 および  のビット反転はそれぞれ ,  であり、2の補数はそれぞれ ,  となる（表も参照）。

## 脚注

### 注釈

### 出典

## 参考文献

* 
* 
* 
* 
* 
* 
* 
* 
* 
* 

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