2の補数 | Programming Place Plus 用語集

トップページ用語集

名称

解説

ある自然数を2進法で表現したとき、各ビットを足し合わせると 2 のべき乗になる最小の数のことです。

2 のべき乗である数を 2進法で表現すると、1000 とか 10000000 のように、最上位ビットが 1、そのほかのすべてのビットが 0 になります。

8ビットの2進数 01011011 に対する2の補数を求めるとします。まず、1桁大きい 2 のべき乗の数を決めます。それは 9ビット目が 1、それ以外が 0 の数ということになるので、100000000 です。この数から元の数を引くと 10100101 となり、これが 01011011 の2の補数です。

2の補数を求めるほかの考え方として、1の補数を求めてから +1 するという方法があります。1の補数は、各ビットを反転させるだけで求められるので、こちらのほうが分かりやすいかもしれません(01011011 の1の補数は 10100100。ここに +1 して 10100101)。

2の補数や1の補数は、コンピュータで負の数を表現する方法として用いられます(2の補数による表現のほうが一般的です)。その場合、ビット列の最上位ビットを符号ビットとして用い、符号ビットが 0 なら正の数、1 なら負の数を表すものとします。たとえば、-95 という負の整数を2の補数で表現するには、まず 95 を2進法で表して 01011111 とします(8ビットの大きさであるものとします)。この数の2の補数を計算すると 10100001 であり、これが -95 を2の補数で表現したビット列です(符号ビットが 1 であることによって、これが +160 ではなく -95 であることが分かる)。

2の補数で表現された負の数を 10進数に戻すには、まず -1 してから、各ビットを反転させる方法が分かりやすいでしょう(10100001 を -1 すると 10100000。各ビットを反転すると 01011111。これを 10進数に変換すると 95。元々、負の数だったので 10100001 は -95 のこと)。

2の補数によって符号付きの数を表現すると、正の方向よりも負の方向のほうが 1つだけ表現範囲が広くなります。8ビットであるとすると、表現可能な最大値は 01111111 であり(最大の数は正の数なので、符号ビットを 0 にしなければならない)、これは +127 のことです。一方、最小値は 10000000 ということになります。こちらは -128 のことです(10000000 を -1 すると 01111111。各ビットを反転すると 10000000。10進数では 128。よって、10000000 は -128)。

負の方に表現力が大きいため、絶対値を求めるときに問題になることがあります。たとえば、-128 の絶対値は 128 であることを期待しますが、2の補数の下では正の 128 を表現できません。C言語で絶対値を求める abs関数は、絶対値を表現できない場合を未定義の動作としています(C言語編のリファレンスを参照)。


参考リンク

更新履歴


用語集のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る