header image

枝折

補数表現について

CS

CREATED: 2026 / 05 / 07 Thu

UPDATED: 2026 / 05 / 07 Thu

1の補数と2の補数の仕組み、そして2の補数が減算に使われる理由を整理してみました。

補数とは

補数(complement) とは、ある数を特定の基準値にするために必要な「補い」の数のことです。 コンピュータでは、固定ビット幅の中で負の数を表現するために補数表現が使われます。

n ビットで数を表す場合、最上位ビット(MSB)を符号ビットとして扱います。 0 なら正、1 なら負を意味します。

1の補数表現

1 の補数(1’s complement)は、各ビットを反転(NOT 演算)することで得られます。

例:4 ビットで 5(= 0101(2))の 1 の補数を求めます。

0101  →  各ビットを反転  →  1010

よって、-51010(2) と表現されます。

4 ビットにおける 1 の補数の表現範囲は以下の通りです。

2 進数10 進数
0111+7
0001+1
0000+0
1111-0
1110-1
1000-7

問題点:+0 と -0 の二重表現

0000 は +0、1111 は -0 を意味し、同じ「0」に 2 つの表現が存在します。 これは演算を複雑にするため、現代のコンピュータではほとんど使われていません。

2の補数表現

2 の補数(2’s complement)は、1 の補数に 1 を加えることで得られます。

2の補数 = 1の補数 + 1

例:4 ビットで 5(= 0101(2))の 2 の補数を求めます。

0101(2)
↓ 各ビットを反転(1の補数)
1010(2)
↓ 1を加算
1011(2)

よって、-51011(2) と表現されます。

4 ビットにおける 2 の補数の表現範囲は以下の通りです。

2 進数10 進数
0111+7
0001+1
00000
1111-1
1110-2
1000-8

+0 と -0 の二重表現が解消され、00000 の 1 通りだけです。 n ビットで表現できる範囲は -2^(n-1)2^(n-1) - 1 となります。 4 ビットの場合は -8+7 です。

なぜ2の補数が使われるのか

2 の補数が広く採用される最大の理由は、減算を加算として実現できることです。

減算を加算として実現する

通常の計算では A - B を直接行いますが、2 の補数を使うと次のように変換できます。

A - B = A + (-B)

-B は B の 2 の補数に相当します。つまり、加算回路だけで減算も行えます。

具体例:5 - 3 を 4 ビットで計算します。

  5 = 0101(2)
  3 = 0011(2) → 2の補数 → 1101(2)

  0 1 0 1  (= 5)
+ 1 1 0 1  (= -3)
---------
  0 0 1 0  (= 2、最上位からの繰り上がりは無視)

10 進数で確認すると、5 - 3 = 2 です。

コンピュータ回路の簡素化

加算回路(ALU)だけで加算と減算の両方を処理できるため、回路設計が大幅に簡素化されます。 1 の補数では +0 と -0 の問題があり特別な処理が必要でしたが、2 の補数にはそのような問題がありません。

を仕舞い

参考資料📕