アットウィキロゴ

6.正の数から負の数を作る(補数表現)

これまでに説明したように、
 ●掛け算は足し算でできる。(3×5、は、3を5回加えればできる)
 ●割り算は引き算でできる。(35÷8、であれば、35-8=27、27-8=19、19-8=11、11-8=3、と4回8を引けば3が余る)
さらに、A-B=A+(-B)と書けることから、
 ●引き算は、正の数Bから(-B)を作り、Aに加えれば、できる。
以上のことから、足し算の回路と、負の数の作り方が分かれば、計算機の計算の仕組みは理解できたことになる。

補数表現について

以後、8ビット整数を考えよう。8ビット整数とは、8桁の2進数のことである。

  • 先頭の1ビットを「符号ビット」とする。
  ⇒符号ビットが「0」なら0または正の数、「1」なら負の数とする。

上の制約のもとで、8ビット整数を10進整数に対応付けてみる。

  • まず、「00000000」は当然、「0」とする。
2進数の加法法則(0+0=0、0+1=1、1+0=1、1+1=10)という法則の下で、対応を付けると
   00000000 ⇔ 「0」
   00000001 ⇔ 「1」
   00000010 ⇔ 「2」
   00000011 ⇔ 「3」
     ・・・
   01111111 ⇔ 「127」
となる。

  • 「11111111」は何を表すのか?
2進数の加算法則に従うと
   11111111 ⇔ X
  +       1 ⇔ 「1」
  ―――――――――――
  100000000
となるが、今は考えている数字の桁が8桁なので、9桁目を考えられないので「無視」する。
すると、100000000=00000000=「0」 となり、
   X+1=0
となる負の数(先頭のビットが「1」だから)だから、 「X=-1」が得られる。すなわち、
  • 「11111111」=「-1」
これに従うと、
   11111111 ⇔ 「-1」
  +11111111 ⇔ 「-1」
  ―――――――――――
  111111110
同様に9桁目を無視して、「11111110」=「-2」が分かる。

では、「10000000」は何か?
このパターンの0と1を逆転させると、「01111111」で、これは正の数「127」である。当然ながら、
   10000000 ⇔ 「X」
  +01111111 ⇔ 「127」
  ―――――――――――
   11111111=「-1」
だから、X+127=-1、であり、X=-128、がわかる。
まとめよう。

8ビット整数は、
  01111111 = 「127」
     \vdots
  00000001 = 「1」
  00000000 = 「0」
  11111111 = 「-1」
  11111110 = 「-2」
     \vdots
  10000000 = 「-128」
というように、-128~127までの256個の数字を8桁のビットで表現する。

例題1.次の10進整数を8ビット整数で表現しなさい。

   (1). 86 (2). -119
(解)
(1). 86÷16=5...6 、 5÷16=0...5  であるので、86(10)=56(16)。これを2進数に直して
  「01010110」
(2). 119÷16=7...7、 7÷16=0...7  であるので、119(10)=77(16)。これを2進数に直して
  「01110111」
  この0と1を逆転させると、「10001000」を得る。これと、上の「01110111」を加えると「11111111」となるので、
  119+「10001000」=-1. よって、「10001000」=-120
  ゆえに、-119=「10001000」+1=「10001001」がわかる。

例題2.次の8ビット整数を10進整数に直せ。

  (1). 01010101   (2). 11001100
(解)
(1). 小さいほうから位取りして、1+4+16+64=85.
(2). 0と1を逆転した数を考える: 「00110011」
  これは、小さいほうから位取りして、1+2+16+32=51.
  ゆえに、「11001100」+「00110011」=「11001100」+51=-1
  よって、「11001100」=-52.                                ■

今回のような8ビット整数の表現を「2の補数表現」という。
実際に使用されている整数型は、単精度整数が16ビット整数、倍精度整数が32ビット整数である。

オーバーフローとは

8ビット整数の場合には、127+1=-128、と、正の数に数を加えたら負の数になることがある。
計算可能な範囲を超えて計算してしまう。
これを「オーバーフロー」という。

次回は、いよいよ実数が登場する。

最終更新:2011年10月20日 14:09