Kenji Arisawa Aichi University |
Powered by Pegasus |
計算機では数は、ある定められた桁(バイト)数のメモリに記憶されていることが多い。整数の場合には、1バイト、2バイト、4バイト、あるいは最近では8バイトを使用する。ここでは2バイトで整数を扱う場合を解説する。(他のバイト数の場合も同様である。)
2バイトのメモリは 216 = 65536 通りのデータを記憶できる。これらの内部状態と10進数の対応は以下の通りである。
| 内部状態(2進数) | 10進数 |
|---|---|
| 0000000000000000 | 0 |
| 0000000000000001 | 1 |
| 0000000000000010 | 2 |
| 0000000000000011 | 3 |
| 0000000000000100 | 4 |
| ... | |
| 0111111111111111 | 32767 |
| 1000000000000000 | 32768 |
| 1000000000000001 | 32769 |
| ... | |
| 1111111111111100 | 65532 |
| 1111111111111101 | 65533 |
| 1111111111111110 | 65534 |
| 1111111111111111 | 65535 |
表1
従って、もしも2バイトのメモリに整数を格納する場合に負の整数を扱う必要がないなら、ここには 0 から 65535 までの整数が格納可能である。
さて、最後の数に 1 を加えるとどのようになるか? 普通の2進数の計算では

となるが、今の場合には(16ビットしか使えないので)この数は記憶できない! (これを桁溢れと言う。) この場合の処理としては2つの考え方がある。
第2の考え方では溢れた 1 を捨てて、

とみなすのである。
注意: 第2の考え方は特殊な考え方ではない。同様な考え方は身近に多く見られる。例えば自動車の走行距離を表示するデジタルカウンタは999999のあと、000000に戻る。

自動車の走行メーター
計算機での整数計算は普通は第2の考え方に立つ。理由は、このように考えることによって負の整数を自然に扱えるからである。
第2の考え方に立つと他の整数は次のように考えることができる。
負の数、例えば -1 は 1 を加えると 0 になる数である。すなわち、
-1 + 1 = 0
従って
-1 = 1111111111111111(2)
同様に
-2 = 1111111111111110(2)
-3 = 1111111111111101(2)
...
2バイトで扱える数の個数 65536 の半分を負の数とみなす場合には左端の1ビットの値が 0 の場合に非負整数(負でない整数)、1の場合に負の整数と考える。すると負の数を考慮に入れた対応関係は次のようになる。
| 内部状態(2進数) | 10進数 |
|---|---|
| 0000000000000000 | 0 |
| 0000000000000001 | 1 |
| 0000000000000010 | 2 |
| 0000000000000011 | 3 |
| 0000000000000100 | 4 |
| ... | |
| 0111111111111111 | 32767 |
| 1000000000000000 | -32768 |
| 1000000000000001 | -32767 |
| ... | |
| 1111111111111100 | -4 |
| 1111111111111101 | -3 |
| 1111111111111110 | -2 |
| 1111111111111111 | -1 |
表2
2バイトのメモリでは 65536 は 0 とみなされるので、数字が書かれたテープを次の図のように 65536 を 0 と重ね合わせて張り合わせた円環と似ている。65535 は 0 の手前の数字なので −1 とみなすことができる。

図1
問題3
4ビットのメモリを使って負の整数を含む整数を扱う場合にはメモリの状態に応じてどの数が割り当てられるか?
| 内部状態 | 10進数 |
|---|---|
| 0000 | 0 |
| 0001 | 1 |
| 0010 | 2 |
| 0011 | 3 |
| 0100 | 4 |
| 0101 | 5 |
| 0110 | ? |
| 0111 | ? |
| 1000 | ? |
| 1001 | ? |
| 1010 | ? |
| 1011 | ? |
| 1100 | ? |
| 1101 | ? |
| 1110 | ? |
| 1111 | ? |
問題4.