2の補数とは何か

2の補数とは何か

2の補数とは何か

序論

コンピュータにおける整数演算では、「2の補数」という表現方法が

事実上の標準として用いられている。

しかし多くの解説では、その計算方法や導入理由が省略され、

「2の補数とは2の補数である」という同語反復に近い説明に

留まっている場合が多い。

本節では、2の補数を数学的概念としてではなく、

「有限ビット幅しか持たない計算機が、

引き算を足し算だけで処理するために選択した表現規則」

として説明する。

本論

CPUが直面した制約

CPUは有限個のビットで数値を表現する。

例えば8ビットの場合、表現できる状態は

00000000 から 11111111 までの256通りしか存在しない。

この制約のもとで、正の数と負の数の両方を扱うには、

同じビット列に対して異なる意味を割り当てる必要がある。

数値を円環として扱う発想

8ビット整数は、0から255まで直線的に並んでいるのではなく、

255の次に0へ戻る「円環構造」を持つと考えることができる。

この円環の前半を正の数、

後半を負の数として解釈するという規則が

2の補数表現である。

2の補数表現の割り当て

8ビットの場合、以下のように解釈される。

  • 00000000 ~ 01111111 : 0 ~ 127
  • 10000000 ~ 11111111 : -128 ~ -1

ビット列そのものは変化しておらず、

人間がどのように意味付けするかだけが異なる点が重要である。

2の補数の計算方法

ある正の数Xに対して、その負の数(-X)を表す

2の補数は次の手順で求められる。

  1. Xを2進数で表す
  2. すべてのビットを反転する
  3. 1を加算する

例として、1の2の補数は次のように計算される。

00000001
↓ 反転
11111110
↓ +1
11111111

なぜ足し算だけで引き算になるのか

引き算は「負の数を足す」こととして処理される。

例えば 3 – 1 は、3 + (-1) として計算される。

  00000011
+ 11111111
-----------
1 00000010

最上位の桁あふれは破棄され、

残った 00000010 が計算結果となる。

CPUは足し算しか行っていないが、

結果として引き算が実現されている。

2の補数がもたらした効果

2の補数表現により、

CPUは足し算回路だけで

引き算や符号付き演算を処理できるようになった。

これは回路の簡素化、高速化、信頼性向上に直結する。

結論

2の補数とは、数の本質的性質ではなく、

有限ビット幅という制約の中で

計算機を単純に動作させるために選択された

工学的な表現規則である。

その仕組みを理解せずに用いると、

オーバーフローや符号反転といった境界条件で

重大な誤動作を引き起こす可能性がある。

Q&A

Q. なぜ2の補数という名前なのですか?
A. 基数が2(2進数)であり、

「基数に対する補数」を用いて

負の数を表現する方法だからです。

Q. 正の数が負の数に変わるのですか?
A. 変わりません。

ビット列は同じままで、

人間がその意味を負の数として

解釈しているだけです。

Q. CPUは本当に負の数を理解していますか?
A. 理解していません。

CPUは常にビット列の足し算をしているだけで、

負の数という概念は人間側の解釈です。

Q. なぜ計算結果が壊れることがあるのですか?
A. 有限ビット幅を超えた計算結果は

切り捨てられるため、

境界条件では人間の期待と

異なる結果になることがあります。