補数

● 補数って何? ●

 10年以上前、こんな質問を受けました。

 「補数(ほすう)って何ですか?」
 どうも、コンピュータ関係で出てくるらしいのです。
 「・・・・・」
 ぎゃくに、補数ってどんなものか教えてもらうことになってしまいました。

 こういうことでした。
 2進法のお話です。
 (2進法について知らない人は、
 <お勉強>の「1000−1」と「0.999・・・=1」を読んでね。)

 たとえば 「0110」 なら こうするというのです。
 「1」 と 「0」 を反対にします。
 そうすると、「1001」になります。
 それに 「1」 をたします。
 そうすると 「1010」になります。
 このとき、「1010」をもとの「0110」の補数というらしいのです。

 それで、なんでこんなことするの?
 そもそも、こんなことして出てくる補数って何? 
ということでした。

 せめてその時、これは負の数をあらわすのに使うんだよ
といってくれたらピンときたと思うのですが・・・。

 


● 負の数 ●

 小学校で習いました。
 たし算は入れかえてもいいけど、ひき算は入れかえられない。

   23   は  32  としてもいい
   23   は  32  としてはだめ

 これって、とっても不便(ふべん)ですね。

 そこで、中学校からはこうなりました。
 そのままいれかえてはだめだけど、符号(+や−)をつけてなら入れかえてもいい。

   

   2+3  は +2 と +3 で 入れかえると  +3+2
   2−3  は +2 と −3 で 入れかえると  −3+2

 これを使って、こんな計算はかんたんにできました。

   

   7−4+3−6 = +7+3−4−6
             = +10−10
             = 0

   こうしたのです。
       7−4+3−6 は +7 と −4 と +3 と −6 です。
   入れかえて プラス と マイナス を集めます。
   +7 と +3 を集め −4 と −6 を集めます。
   それぞれ計算してから答えをだしました。

 それで〜?いったい何がいいたいの?

 負の数を作り出したことで、ひき算がたし算になって
とっても便利になったな〜ってことです。

 おまけに、5たりない数を −5 ってあらわしたのは、大けっ作!!
 ひき算の  と 負の数をあらわす符号の  が同じで、
これをごちゃまぜにして使っていいのですから・・・。

 えっ、何一人で感心しているかって?
 こういうことです。

 5たりない数って、何にたりないかというと、もちろん  にです。
 そして、 5 に −5 を補(おぎな)うと 0 になります。

   5 + (−5) = 0

 べつに、ほかのあらわし方をしてもよかったのです。

   5 +   = 0

 この  の数を *5 ってあらわそうが、@5 ってあらわそうが
どうでもよかったのです。
 でもこれを −5 ってあらわしたのは すばらしかった!!
と、感心しているのです。

 ところで、補集合(ほしゅうごう)って知っていますか。

 集合A ではたりないので、補(おぎな)う集合、これが補集合A です。
 何にたりないかって?
 それは全体集合にです。
 集合A に その補集合A を補(おぎな)うと 全体集合 になります。

  

 さて、それでは、補数っていったい何を補(おぎな)っているの?
 いったい何にたりないの?

 


● 0(ゼロ) ●

 このホームページのアクセスカウンタをみましたか?

 えっ、訪問者が少ないって?
 そりゃ、まだ作り始めてから2ヶ月しかたっていないし・・・。
 それに、コンテンツが1つ2つしかないうちからUPしてしまったから・・・。

 と、苦しい言い訳はどうでもよいとして、
これ 99999 人をオーバーしたらどうなるのでしょう?

       99999
    +)     1
      00000

 この 00000 の  は オーバーフローしてしまいます。
 5けたしか入らないところに 6けたも入れようというのはむりです。

 ですから、99999 の次の人は、きっと 00000 になるでしょう。
 (そんな日は 永遠にやってこない予定・・・?)

 家の方で、車の運転をする人がいたら、聞いてみてください。
 走行距離が、10万キロメートルをオーバーすると、どうなるかって・・・。

 さて、さんすう・数学では  は 0 しかありません。
 それも、「0の発見」は大発見(大発明)でした。

 でも、コンピュータにとって  は 00000 のことで、
100000 も 00000 で やっぱり 0 なのです。

 


● ひき算 ●

 ひき算はとくいですか?

 だいたいの人は、きらいですね。
 それも、くりさがりのあるひき算は、いやなものです。

 今回は、10000円札をだしていくらおつりをもらうか、
つまり、10000 からひく ひき算をやります。

 ためしに、 10000−1234 をやってみましょう。

     10000
  −)  1234
      8766

 これを、こんなふうにやってみます。

 10000 は 9999+1 だから、9999 からひいておいて、後で  たすのです。

      9999      8765
  −)  1234   +)    
      8765      8766

 今回は、くりさがりのあるひき算でないので、ちょっぴり楽でしたね。
 (でも、あとで  たすのをわすれると大変です。)

 さて、ここで <お勉強>の「1000−1」 を思い出してください。

 10進数では、
             10−1=9
            100−1=99
           1000−1=999
          10000−1=9999

 2進数では、
                  (10) −(1)=(1) 
                (100) −(1)=(11) 
              (1000) −(1)=(111) 
              (10000) −(1)=(1111) 

 そこで、ためしに (10000) −(0110) をやってみます。
 ただし、今度はとなりから 10 かりてくるのではなく  かりてきます。

      (10000) 
   −)  (0110) 
       (1010) 

 できましたか?
 これを、10進数のときと同じようにしてやると、次のようになります。

       (1111)        (1001) 
   −)  (0110)     +)    (1) 
       (1001)        (1010) 

  ここで、(1111)  からひくひき算で、
ひいた答えの (1001) は、ひく数 (0110) の
「1」 と 「0」 を反対にしたもの (1と0の反転)
になっていることに注意してください。
 そして、それに 「1」 をたして 答をだしました。

 さあ、ここで最初のぎもんにもどりましょう。
 こうでしたね。

 「0110」 の 補数 はこういうものでした。
 「1」 と 「0」 を反対にします。
 そうすると、「1001」になります。
 それに 「1」 をたします。
 そうすると 「1010」になります。
 このとき、「1010」をもとの「0110」の補数といいます。

 それで、なんでこんなことするの?
 そもそも、こんなことして出てくる補数って何?ということでした。

 これまでで、(10000) −(0110)2 の答えとわかりました。
 つまり、

    (10000) −(0110)2 = (1010) 

 さらに、ひき算のたしかめはたし算で・・・ということで、これは

    (0110)2 + (1010) = (10000) 

となります。
 ところが、(0000)  の  は オーバーフローして
じっさいは (0000)  ですから、けっきょく、次のようになりました。

    (0110)2 + (1010) = (0000) 

 これって、

    (0110) +   = (0000) 

 の □ にあてはまる数が (1010)2 だということです。
 つまり、負の数です。
 (0110) は 6 ですから、 −6 にあたる数が (1010)2 だということです。


● 整数 ●

 2進法で、正の整数と負の整数をあらわしてみましょう。

 お話を 4けた ですすめましょう。

   10進法の 0 は 2進法の (0000)  
   10進法の 1 は 2進法の (0001)  
   10進法の 2 は 2進法の (0010)  
   10進法の 3 は 2進法の (0011)  
   10進法の 4 は 2進法の (0100)  
   10進法の 5 は 2進法の (0101)  
   10進法の 6 は 2進法の (0110)  
   10進法の 7 は 2進法の (0111)  

 今度は、負の数です。

   10進法の −1 は 2進法の (0001) の補数で (1111)
   【求め方】 (0001)2 −−> (1110)2 −−> (1111)

   10進法の −2 は 2進法の (0010) の補数で (1110)
   【求め方】 (0010)2 −−> (1101)2 −−> (1110)

   10進法の −3 は 2進法の (0011) の補数で (1101)
   【求め方】 (0011)2 −−> (1100)2 −−> (1101)

   10進法の −4 は 2進法の (0100) の補数で (1100)
   【求め方】 (0100)2 −−> (1011)2 −−> (1100)

   10進法の −5 は 2進法の (0101) の補数で (1011)
   【求め方】 (0101)2 −−> (1010)2 −−> (1011)

   10進法の −6 は 2進法の (0110) の補数で (1010)
   【求め方】 (0110)2 −−> (1001)2 −−> (1010)

   10進法の −7 は 2進法の (0111) の補数で (1001)
   【求め方】 (0111)2 −−> (1000)2 −−> (1001)

 もう一度まとめましょう。(4けたであらわす場合です。)

   0 は  (0000
   1 は  (00012  −1 は (1111
   2 は  (00102  −2 は (1110
   3 は  (00112  −3 は (1101
   4 は  (01002  −4 は (1100
   5 は  (01012  −5 は (1011
   6 は  (01102  −6 は (1010
   7 は  (01112  −7 は (1001

 さて、4けたであらわせる数がもうひとつあります。
 そう、(10002 です。
 これは何にしたらよいでしょうか。

 一番上の位の数が 1 ですから、負の数です。
 そして、111、110、101、100、011、010、001 の次ですから・・・。
 そうですね。
 −7 の もうひとつ下 つまり −8 にするとよさそうです。

 そうすると、4けたで整数をあらわそうとすると、
    −8 から +7 まで
の数があらわせます。

 プログラムをくむとき、変数という入れ物を使います。
 そして、その変数という入れ物には、大きさだけでなく、
中に入れる数によって、いろいろな種類(型)があります。
 正の整数だけを入れるとか、(正負の)整数を入れるとか、小数を入れるとか・・・。

 (正負の)整数を入れる変数の型で、
マイナスいくらからプラスいくらまでの数を入れられるのか、
一度じっくり見てみてください。

 たとえば、C言語では次のようになっています。

    char  は  8けたで        −128 〜 +127
    short  は 16けたで      −32768 〜 +32767
    long  は 32けたで −2147483648 〜 +2147483647

 +と−の後に続く数(絶対値)が 1 ちがっていますね。
 (あまりにも、こまかい話ですが・・・)

 最後に、コンピュータは、ひき算はたし算でやるのです。
 もう、どうするのかわかった人もいますね。
 できたら、また今度お話するかも・・・。


HOME(もどる)

掲載内容の無断転載、転用、編集を禁じます。(c) 小林吹代
All Rights Reserved, (c)kobayashi fukiyo , 2001