2の補数(ニノホスウ)とは | 意味や読み方など丁寧でわかりやすい用語解説
2の補数(ニノホスウ)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。
読み方
日本語表記
二の補数 (ニノホスウ)
英語表記
two's complement (ツーコンプリメント)
用語解説
2の補数とは、コンピュータにおいて負の整数を表現し、同時に減算を効率的に実行するために用いられる数値表現方法である。現代のほとんどのデジタルコンピュータは、この2の補数表現を標準として採用している。コンピュータは全ての情報を0と1のビット列として処理するため、人間が日常的に使う「-」(マイナス)記号を直接理解することはできない。そこで、ビット列の組み合わせだけで正負を区別し、かつ演算処理を単純化できる仕組みが必要となる。
従来の負の数表現として、最上位ビットを符号として用いる「符号と絶対値表現」が考えられる。例えば、8ビットの数値で「5」は「00000101」と表現されるが、この方式では「-5」を「10000101」とする。最上位ビットが0なら正、1なら負といった具合である。しかし、この方式にはいくつかの問題点がある。一つは、「0」の表現が「00000000」(+0)と「10000000」(-0)の二通り存在してしまうことである。もう一つは、減算を行う際に符号を考慮した複雑な回路が必要となり、加算器と減算器を別々に設計しなければならないため、ハードウェアの構成が複雑になる点である。これらの課題を解決し、より効率的な演算を実現するために開発されたのが2の補数表現である。
2の補数表現では、正の整数は通常の二進数表現と全く同じ形式で表される。一方、負の整数は特定の規則に従ってビット列が変換される。ある正の数Xに対して、その負の数-Xを2の補数で表現する手順は以下の通りである。まず、正の数Xの二進数表現を用意する。次に、その二進数表現のすべてのビットを反転させる。つまり、0を1に、1を0に置き換える。この操作を「1の補数を取る」と呼ぶ。最後に、そのビット反転された結果に1を加える。この最終的な結果が、元の正の数Xの負の数-Xの2の補数表現となる。
具体的な例として、8ビットのデータで「5」の2の補数表現における負の数「-5」を求めてみよう。「5」の二進数表現は「00000101」である。 最初のステップとして、この「00000101」のすべてのビットを反転させる。すると、「11111010」が得られる。これが「5」の1の補数である。 次に、この「11111010」に「00000001」(1)を加える。その結果は「11111011」となる。 したがって、8ビットの2の補数表現において、「-5」は「11111011」と表現される。このとき、最上位ビットが「1」であるため、これが負の数であることを示している。
逆に、負の数である「11111011」がどのような値を表しているかを知りたい場合も、同様の変換手順を適用する。 まず、「11111011」のすべてのビットを反転させる。すると「00000100」が得られる。 次に、この「00000100」に「00000001」(1)を加える。その結果は「00000101」となる。 この「00000101」は「5」であるため、「11111011」は「-5」を表していることが確認できる。最上位ビットが「1」であることから、負の数として解釈する必要がある。
2の補数表現がコンピュータの演算を効率化する最大の理由は、減算を実質的に加算として処理できる点にある。例えば、A - B という計算は、A + (-B) と表現できる。ここで、-B はBの2の補数表現である。コンピュータは、この負の数を表現する仕組みと加算器のみを用いて、減算演算を正確に行うことができる。これにより、減算専用の複雑な回路を必要とせず、加算器のみで加減算の両方を処理できるため、ハードウェアの設計が簡素化され、処理速度の向上にも貢献している。
具体的な加算の例として、8ビット表現で 5 - 3 を計算してみよう。
「5」は「00000101」である。
「3」は「00000011」である。
まず、「-3」の2の補数表現を求める。「3」のビット反転は「11111100」であり、これに1を加えると「11111101」となる。これが「-3」の2の補数表現である。
次に、5 + (-3) として加算を実行する。
00000101 (5)
+ 11111101 (-3)
----------
100000010
この計算結果は9ビットになるが、8ビットシステムでは最も左の桁あふれ(キャリービット)は無視される。残された8ビットは「00000010」であり、これは二進数で「2」を表す。このように、減算が加算器によって正確に計算された。
2の補数表現における数値の範囲は、ビット数によって決まる。例えば、8ビットの場合、表現できる値の範囲は-128から+127までとなる。0の表現は「00000000」の一通りであり、符号と絶対値表現の抱えていた問題は解決される。また、表現できる負の数の絶対値の最大値(-128)は、正の数の絶対値の最大値(+127)よりも1だけ大きいという非対称性があることも特徴である。
このように、2の補数表現は、その効率性とハードウェア実装の簡素さから、現代のコンピュータアーキテクチャにおいて不可欠な技術となっている。システムエンジニアを目指す上で、コンピュータが内部でどのように数値を扱っているかを理解することは、データ型の範囲、演算結果のオーバーフロー、ビット単位の操作などを正しく理解するために非常に重要である。