数,特に整数を扱うには4,8,16,32bitといったデータ幅を使うのが普通である。 創成期のパソコンは10進表現1桁の計算ができるように, 0から9の2進表現で0000から1001に対応して, 計算対象のデータのビット幅を4bitとした。 その後,英数字を表すのに必要なビット幅に対応して, 8bitのものが作られるようになった。 このため8bitを1byte6.5とも言う。 しばしば,bがbit,Bがbyteの略として使われることがある。
さらに,大きな数の演算が一気にできるようにと, ビット幅16bitや32bitのパソコンが作られるようになってきており, かつての大型コンピュータをしのぐものが個人宅にも置かれるようになってきている。 ちなみに,Unixでは単精度16bit,倍精度32bitのものが多い。 本書ではデータ幅は16bitのものを基本とするが, 本章に限り,数式計算の全容をつかめるよう, データ幅を4bitと狭くして例示を行う。
以下,説明にあたって, 2進表現の最上位のビットのことをMSB(most significant bit), 最下位のビットのことをLSB(least significant bit)と呼ぶことにする。 10進表現の0,1,2,3,...を4bitの2進表現すると, 0000,0001,0010,0011,...,1111となる。 この場合,0から15までの16個の数を表現することができる。 ビット列をこのように正整数に対応させたものを符号なし整数(unsigned integer)と言う。 念のために,符号なし整数の10進,2進,16進表現の対応表を 図 6.2に示す。
この4bit内で負数も表現しようとすると,MSBを符号用に確保し,
残る3bitを符号を外した整数に対応させるのが便利である。
これを符号あり整数(signed integer)と呼ぶ。
この場合,0000から0111を10進表現の0から7の正整数に対応させる。
また,1000から1111を
8から
1の負整数に対応させる。
具体的には図 6.3に示すようにコード化する。
負数の表現については,若干の説明が必要であろう。
多くのコンピュータでは負数を表すのに,大小関係が崩れないように,
これらのうちもっとも小さなものをもっとも負側の最小数とし,
もっとも大きなものを
1とする。
4bitの場合,具体的には1000が
8であり1111が
1になる。
例えば2(0010)に対し,
2は1110と表現されるが,
これらを加えると16(1 0000)となる。
一般的に,データ幅
bitの場合,負数
に対し,
内部表現を
としていることになる。
したがって,負数とその絶対値との和(sum)は一定数
(
=4では16)
となる。
こうした負数の表現を補数(compliment)表現6.6と言う。
負数をこのように16だけ大きな正数で表現することにすると,
1と15の区別がつかなくなる。
同様に
2と14など多くの重複が出てくる。
このような重複を避けると,
4bitで表現できる正数は0(0000)から最大7(0111)とし,
負数は
8(1000)から
1(1111)に限るのがよい。
この範囲に限ることにより,負数のMSBは必ず1になるのである。
これらの正負の対を見ると,すべての0と1を反転し,
それに1を加えた形となっている。
ただし,0と
8の関係は例外となっている。
元の数とその0と1を反転した数の和は1111とすべてのbitが1となる。
これに1を加えれば1 0000であるので,このことから直ちに理解できよう。
このような補数を採用すると,次節に示すように,
正数や負数が入り乱れたときの加減算の計算が簡単になるのである。