《補数》
Create:2002/02/11
[BACK] [NEXT] [メニュー]
   7−3を計算する場合には、7に(−3)を加えるということにもなる。
   7+(−3)これではまだ7−3とあまり変わらないよう思える。
   ここで、−3の部分を正の数で表すことができればだいぶ違うのだが。
   これを可能にするために次の様に考える。

   10進数の−3の絶対値3にある数を足して繰り上がる(10になる)数は7であるから
   7+7=14で、10の桁は無視すると4が残りこれが答えとなる。
   この時、「3の補数は7」ということになる。

   以上をまとめると        7−3 = 7+(−3)
     ・引く数の補数を求める   3の補数は7
     ・補数で足し算する     7+7 = 14
     ・繰り上がりを無視する   4

   補数の考え方を取り入れる理由は、このように「減算を加算で処理できるから」
   である。                   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄


【2の補数】
   コンピュータが実際に扱う2進数の場合を考えてみる。
   この場合も同じように7−3の計算とし、2進数で8桁とする。
   7−3を計算するには、7に(−3)を加えるという方法をとった。
   10進数3を2進数8ビットで表すと 00000011であるから、同様に
   00000011にある2進数にを足して100000000になる
   (9桁目に繰り上げる)数はを求めると 
                     100000000 
                   −  00000011
                  ────────────
                      11111101

   00000011の2の補数11111101が求まるが、これを簡単に求める方法がある。
   「0と1のビットパターンを反対にして1を加える」という操作をする。
     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   (上記減算の引く数と答えを見ると、なんとなくそんな感じはするが)
  
                    00000011
   0と1のビットパターンを反転する ↓↓↓↓↓↓↓↓
                    11111100
   1を加算する         + 00000001
                 ────────────
                    11111101

   よって、10進数3の2の補数は11111101となり、7−3の代わりに
   7+(−3)= 7+(3の2の補数)という計算を行と

                    00000111
                  + 11111101
                 ────────────
                   100000100
                    ̄
                   ↓
              桁あふれは無視する。
   よって 00000100(=10進数の4)のなる。
   このやり方により演算回路は加算だけあればよいことになる。
   つまり、減算のかわりにその数の2の補数を加算しているのである。
   同様に、掛け算は加算を繰り返し、除算は減算の繰り返しで実現可能になる。
   コンピュータでは、いろいろな計算ができるが、ハードウェア的には加算しかできないのである。


【2の補数を使っての表現】
   補数を使えば減算のかわりに加算で処理ができるが、それだけではなく「負の値を表す」
   ためにも使用される。                        ̄ ̄ ̄ ̄ ̄ ̄

   例えば8ビットで表現できる数は次のようになる。

     ビット列        10進数
     00000000 →    0
     00000001 →    1
     00000010 →    2
        :
     01111110 →  126
     01111111 →  127
     10000000 →  128
     10000001 →  129
        :
     11111110 →  254
     11111111 →  255

   上記のように0〜255が表現できる。

   しかし、負の数を表現する必要があり、そこで負の数は2の補数を使用する。

   2の補数を求めるには0と1を反転して次に1を加えるという操作を行った。

   10進数1の「2の補数」を求める
      2進数で10進数1を表すと    00000001
      0と1のビットパターンを反転する ↓↓↓↓↓↓↓↓
                      11111110
      1を加算する         + 00000001
                    ────────────
      このビット列が−1        11111111 


   同様に10進数2の「2の補数」を求める
      2進数で10進数2を表すと    00000010
      0と1のビットパターンを反転する ↓↓↓↓↓↓↓↓
                       11111101
      1を加算する         + 00000001
                    ────────────
      このビット列が−2        11111110 


      以下同様に計算すると次のようになる。

      ビット列        10進数

      11111111 →  −1
      11111110 →  −2
      11111101 →  −3
      11111100 →  −4
         :
      10000010 →  −126
      10000001 →  −127
      10000000 →  −128       

      以上より、ビット列と10進数の対応は次のようになる。

      ビット列        10進数
      00000000 →     0
      00000001 →     1
      00000010 →     2
         :
      01111110 →   126
      01111111 →   127
      10000000 →  −128
      10000001 →  −127
         :
      11111110 →    −2
      11111111 →    −1

   ところで、同じ10000001という2進数でも、それが正の値である129なのか
   それとも負の値である−127を表しているのかが区別できないように思える。
   それは、上記例からもわかるように2進数の最上位桁が1のものは負の値を補数で表している
   ことになる。
   これらの考え方はビット数に関わりなく適用できる。

   又、上記8ビットの例から2の補数を使ってnビットで表現できる整数の範囲は

        −2^(n−1) 〜 2^(n−1)−1 となる。
         ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

   例)
    上記例のn=8の場合

     −2^(n−1) =−2^(8−1)
              =−2^7
              =−128
     2^(n−1)−1=2^(8−1)−1
              =2^7−1
              =128−1
              =127
     よって、−128〜127 となる。
          ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄


【固定小数点の形式】

    8 7 6 5 4 3 2 1  第8ビット:8(=2^3)の位
   ┌─┬─┬─┬─┬─┬─┬─┬─┐ 第7ビット:4(=2^2)の位
   │ │ │ │ │ │ │ │ │ 第6ビット:2(=2^1)の位
   └─┴─┴─┴─▲─┴─┴─┴─┘ 第5ビット:1の位
           ↑         第4ビット:1/2の位
         小数点位置       第3ビット:1/4の位
                     第2ビット:1/8の位
                     第1ビット:1/16の位

            ┌─┬─┬─┬─┬─┬─┬─┬─┐
    0の場合    │0│0│0│0│0│0│0│0│  
            └─┴─┴─┴─▲─┴─┴─┴─┘
            ┌─┬─┬─┬─┬─┬─┬─┬─┐
    1の場合    │0│0│0│1│0│0│0│0│  
            └─┴─┴─┴─▲─┴─┴─┴─┘
            ┌─┬─┬─┬─┬─┬─┬─┬─┐
    2の場合    │0│0│1│0│0│0│0│0│  
            └─┴─┴─┴─▲─┴─┴─┴─┘
            ┌─┬─┬─┬─┬─┬─┬─┬─┐
    0.5の場合  │0│0│0│0│1│0│0│0│  
            └─┴─┴─┴─▲─┴─┴─┴─┘
            ┌─┬─┬─┬─┬─┬─┬─┬─┐
    2.25の場合 │0│0│1│0│0│1│0│0│  
            └─┴─┴─┴─▲─┴─┴─┴─┘


   例)
    −2.75の場合

     上記例より2.75を8ビットの固定小数点形式で表すと次のようになる

        8 7 6 5 4 3 2 1
       ┌─┬─┬─┬─┬─┬─┬─┬─┐
       │0│0│1│0│1│1│0│0│
       └─┴─┴─┴─▲─┴─┴─┴─┘
           

       この値に基づき2の補数を求める。


                  00101100
       0と1を反転する   ↓↓↓↓↓↓↓↓
                  11010011
       次に1を加算する + 00000001
               ────────────
                  11010100

       よって、−2.75は次のように表される。

         8 7 6 5 4 3 2 1
        ┌─┬─┬─┬─┬─┬─┬─┬─┐
        │1│1│0│1│0│1│0│0│
        └─┴─┴─┴─▲─┴─┴─┴─┘
                ↑
              小数点位置

[BACK] [NEXT] [メニュー]

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル