見出し画像

【コンピュータ】負の数を表す2の補数表現とは? 前編

こんにちは、すうじょうです。さて、今回は初の情報系の記事ということで、まずはここで意味が分からなくて詰まっている人がいるであろうという2の補数表現についてできるだけ分かりやすく解説していきたいと思います。

※本記事は、2023/04/03に内容を改訂しました。

さて、みなさんは多くのコンピュータは0,1の2つの数字の組み合わせで様々なものを表現しているというのを知っていると思います。そのなかで、情報を習った人ならば、2進数の足し算、引き算、(掛け算、割り算)の方法を習ったと思います。

そして、大学になって、情報系に触れた人ならば必ずこの2の補数表現というものを習うと思います。今回は、その負の数の表現方法についてみていきます。

2進数で負の整数を表す①「符号+絶対値」

多くの人は高校で正の数を2進数に表す方法については習ったと思います。ただ、この方法では負の数(ここでは、特に負の整数)を表すことができない。これをうまく解決した方法が2の補数表現です。さて、この前編では、2の補数表現に行く前に負の数を表す単純な方法を紹介したいと思います。

高校では、2進数の表現に桁数の設定はなかったと思います。ですが、実際のコンピュータでは表現できる桁数に限界があります。ここでは、簡単に説明するために、4桁で表現するものとします。

このとき、10進数の3を4桁の2進数にすると、0011となります。そして、このとき一番上の桁を最上位ビット(MSB)といいます。負の数を表す単純な方法にこの最上位ビットを+(0)、-(1)の符号を表す数字と考えるというものがあります。そして、最上位ビットより下の桁で数の絶対値を表現します。これを組み合わせることで、つまり、「符号+絶対値」で数を表現するというものです。

この表現方法で、-3を表すと、符号は-(1)で絶対値は011となるので、1011となります。この表現で問題がないように思えますが、この表現方法には大きく2つの欠点があります。

1つ目は、0の表現方法が2つ生まれてしまい、表現できる数の個数が1つ減ってしまうというものです。具体的には、0を1000と0000の2つで表せてしまいます。これを聞いただけでは、別にそのくらい気にしなければいいのではないかと思う人もいるかもしれません。

2つ目の欠点は致命的なものです。それは、この表現で表した数同士を足す計算が非常にやりづらいということです。

例えば、さきほど例に出した-3と3を足すと0になるはずです。しかし、「符号+絶対値」表現の2進数を素直にそのまま足すと、0011+1011=1110となってしまいます。これは、-6となってしまい、計算結果が合いません。

素直に足さずに、それぞれの数の最上位ビットの符号と、絶対値による計算をすれば正しい結果を得ることはできます。しかし、そうしてしまうと計算する機構の構造が複雑になり、コンピュータが高価になってしまったり、処理に時間がかかり、計算速度が低下してしまいます。

一方今から説明する、2の補数表現はこれらの問題を克服しています。

※負の数を表す方法として、他の方法もありえますが、2の補数表現が優れているため、現在でも採用されています。

2進数で負の整数を表す②「2の補数表現」

さて、ここから本題の2の補数表現について解説していきます。まずは、言葉の意味からいきましょう。そもそも「補数」とはどういった数か確認します。補数のWikipediaによると、

補数(ほすう、complement)とは、ある基数法において、ある自然数 a に足したとき桁が1つ上がる(桁が1つ増える)数のうち最も小さい数をいう。

これだけでは、分かりにくいので、例を考えてみましょう。10進法の場合、3の補数は7で、212の補数は788です。これはそれぞれ、3+7=10で212+788=1000と足すと桁が1つ上がる(位が1つ増える)ことから補数となっています。

これの2進法版が2の補数表現です。ただしここで、少し注意が必要なのは、桁数を設定しているので、それに合わせて桁が上がる数を考えなくてはいけません。

さきほどと同じ4桁の設定の場合、対象の数に足して2進数で10000となる(5桁目に上がる)数を考えます。0010の場合は、10000-0010=1110より、その補数は1110となります。

ここで、「符号+絶対値」表現と同じ例である-3+3を考えてみましょう。-3は、4桁の補数表現で1101となります。(変換方法は後編で説明します)3は、正の数なので、そのまま0011です。これを素直に足すと、10000となりますが、4桁と決めているので、5桁目の数字は無視します。すると、0000となり、10進数にすると0となります。このように補数表現で表した場合、そのまま足して正しい計算結果が得られます。これが、2の補数表現が広く使われている大きな理由の一つです。

ここで、補数表現において大事なことを一つ説明します。n桁(nビット)の2の補数表現の2進数で表せる数の範囲です。普通のn桁の2進数の場合では0~$${2^n-1}$$の範囲を表現できます。正の数の方が1引かれているのは、0の表現によって1つ分減らされているからです。

一方、2の補数表現は、$${-2^{n-1}~2^{n-1}-1}$$という範囲です。例えば、4桁のときは、$${-2^3~2^3-1=-8~7}$$となり、この範囲外の数字は4桁では表現できないことが分かります。

ここまで、符号ビットを使って負の数を表す表現と2の補数表現の概要と優れている理由について説明しました。これ以上は長くなるので、以降の内容は後編に回します。後編では、具体的に10進数と2の補数表現、相互の変換方法について説明をします。では。


この記事が気に入ったらサポートをしてみませんか?