アットウィキロゴ

6.コンピュータ内部での計算の仕組み


コンピュータ内部では、どのように計算をしているのだろうか?

まず、取り扱う事の出来る桁は、有限桁である。一般に、整数演算は、単精度演算は2バイト(=16ビット)、倍精度演算は4バイト(=32ビット)、4倍精度演算は8バイト(=64ビット)で行う。
2バイトの整数の場合、扱う数は、0000000000000000~1111111111111111の数である。単純に10進数に直すと、0~65535になる。

ところで、足し算は良いが、引き算はどうするのか…?これは、補数表現を用いて対処する。分かりやすくするために、8ビットの整数で考えてみよう。

8ビットの場合、00000000(=0)~11111111(=255)である。
ここで、11111111+1=100000000 となる。8ビットの整数なのに9ビットある。電気信号で計算させるので、8桁を超えたところで無視する事にすると、
11111111+1=00000000(=0)
なので、11111111=-1 と考えると都合が良い。都合が良いとそう決めるのが数学者。
先頭の1ビットによって次の規則を置くことにする。

  先頭の1ビットが0なら、0または正の数。
  先頭の1ビットが1なら、負の数。

これにより、8ビットの数は、00000000(=0)~01111111(=127)、そして、負の数は、
11111111(=-1)~10000000(=-128)となり、-128~127 が表現できるようになった。
◎ ところで、上のように決めると、次のようなことが起こる。
    10000000(=-128)+10000000(=-128)=00000000(=0)
!?となりそうなところであるが、表現できる桁数の範囲を超えた演算なので仕方がないのである。このような現象を、オーバーフロー(over flow)という。

例題1 次の8ビットの整数を10進数に直せ。
 (1).01010101   (2).10010011   (3).11001101

(解答)
(1).先頭のビットが0だから、正の数を表す。ゆえに、普通に2進数を10進数に直して、
01010101=64+16+4+1=85
(2).先頭のビットが1だから、負の数を表す。ゆえに、0と1のパターンを逆にした数を考えて、
10進数に直すと、
01101100=64+32+8+4=108
初めの数と、0-1パターンを逆にした数を加えると、全てのビットが1になり、-1である。
結局、初めの数をXで表せば、X+108=-1であり、X=-109がわかる。
(3).先頭のビットが1だから、負の数を表す。ゆえに、0と1のパターンを逆にした数を考えて、
10進数に直すと、
00110010=32+16+2=50
初めの数と、0-1パターンを逆にした数を加えると、全てのビットが1になり、-1である。
結局、初めの数をXで表せば、X+50=-1であり、X=-51がわかる。

上で述べたように、正の数から負の数を導く方法を、2の補数表示方式という。2の補数表示方式は、基本的に、11111111を-1として扱うところに特色がある。

もうひとつの表示方式に、1の補数表示方式がある。これは、対応する負の数を、0-1パターンを単に逆にしたもので表示する。すなわち、01010101は85であるが、-85をこの0-1パターンを逆にした10101010と定める。
一見、この方が作り方が単純で、良さそうに見えるが、実は、0に相当するのは、
00000000 と 11111111
であり、2つの0を作ってしまう。

最終更新:2015年11月16日 17:51