アットウィキロゴ

6.整数表現について(8ビット整数)

いま、8ビットで整数を考える。すなわち、8桁の2進数で、正の数と負の数を考える。
  • 生成規則
先頭のビットを「符号ビット」として、
符号ビットが「0」なら「0または正の数(+)」、「1」なら「負の数(-)」を表すとする。
正の数のときは、通常通りに2進数として扱うとする。

このとき、
  00000000=0_{(10)}
  00000001=1_{(10)}
     \vdots
  01111111=127_{(10)}
となる。

次に「11111111」について考える。
先頭のビットが「1」だから負の数である。試しにこの数に1を足すと、
  11111111 + 1=100000000
となり9ビットになってしまう。
いま考えているのは「8ビット整数」なので、9ビット目を無視すると「100000000=00000000」となり、結局
  11111111+1=00000000
となり、00000000=0_{(10)}であるので、「11111111=-1_{(10)}」であることがわかる。
すなわち、すべてのビットが「1」の数は、10進整数「-1」である。

上記のように、8桁の2進数で整数を表現することを考えると、2進数8桁では256通りのものしか表現できないので、当然、表現できる範囲が限定される。
実際、上の議論から、「10000000」は何になるか?
01111111」=127であるので、10000000 + 01111111 = 11111111=-1 であるから、
10000000=-1-127=-128」であることが分かる。
だから、負の数は、
  11111111=-1_{(10)}
  11111110=-2_{(10)}
     \vdots
  10000000=-128_{(10)}
となる。

ちなみに、
  10000000 + 11111111 = 01111111」より、 「127+1=-128」という驚くべき結果が得られる(この現象を「オーバーフロー(over flow)」という)が、これは、256個しか表現できないという、限られた表示方式で表すことの影響である。
  • 以上のように、「11111111=-1」として整数を表現する方式を、「2の補数表示」という。


例題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を作ってしまい無駄ができる。
このため、整数型数値データには2の補数表示が使用されている。

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

最終更新:2010年11月08日 15:40