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 でシェア
Twitter でツイートフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る