補数と負数


注意:補数の説明を訂正しました。
megumさんから間違っていますとのメールをいただき、読みなおしたところ、大きな間違いをしていました。そこで下記のように訂正しています。他にも間違い、説明不足などたくさんあると思いますが、その際は太チョまで連絡をお願いします。速やかに訂正します。
また、日付が古いほど勉強したてのころのものなので、間違って覚えているところがあると思われます。ご注意下さい。



◆補数
  
○10進数 「100」の10の補数は

     100 ⇔ 900(10の補数という)
  
○10進数 「100」の9の補数は 

   899
9 □□□   この「899」が「100」の9の補数といいます。      
8 □□□   9の補数「899」と「100」を足すと
7 □□□   899+100=999 
6 □□□   その桁で表すことができる数の最大値となる
5 □□□   
4 □□□   次ぎに、9の補数「899」に1を足すと
3 □□□   899+1=900
2 □□□   と10の補数と同じになります
1 ■□□
   100
     
10進数 「100」の10の補数 「900」 は 9の補数 「899」に1を足したものと同
じになる
逆に10進数「100」の 9の補数「899」に1を足した「900」が10の補数である


○補数はパソコン上では負数を足し算で表すのに使われている。

10進数「500」 から 10進数「100」 を引くとき
普通は
  500−100=400 
となります。

補数を利用すると
10進数 「100」 の 10の補数は「900」

500+900=1400 (PC上では桁上がりした1は無視される)


 ○2進数 01010101の補数は
  まず1の補数をもとめる
 
  01010101 → 反転させる 10101010 (1の補数)
  つぎに1の補数に1を足す
 
  10101010+00000001=10101011
  2進数「10101010」の補数は「
10101011」となる


◆負数
  負数(マイナス)を表すため2の補数を使う 

  左端のビットを符号ビットとする  
  11111111
  ↑
  1の時はマイナス、0のときはプラスか0を表す

  ○10進数 -10を2進数で表すには
    10(10)を2進数に変換
     →00001010  (A)
    1の補数をもとめる
     →11110101 
    2の補数をもとめる
     →11110101(1の補数)に1を足す
     →11110110  (B)
    「11110110」(2)が-10(10)となる

  検算
   (A)と(B)を足すと
    00001010
  + 11110110
    ---------
   1 00000000    ← 00000000(2)になる 
  ↑ 
  桁上がり
   もちろん10進数-10と10を足すと0ですね。

  補数の説明は難しいですね。多くの問題を解いて覚えていくしかないかもしれません。

ビットで表現できる数値の範囲

2進数の場合

「0〜(2^(n-1))-1」と「-1〜-(2^(n-1))」
となる


(例)
2進数の3ビットの場合
上の公式にあてはめると
整数:(2^(3-1))-1=(2^2)-1=3
負数:-(2^(3-1))=-(2^2)=-4
よって
 3、2、1、0、-1、-2、-3、-4


★★★宿題:二種向け★(2000/1/26)

 10進数−5.625を,8ビット固定小数点形式による2進数で表したものはどれ
か。ここで,小数点位置は,4ビット目と5ビット目の間とし,負数は2の補数
表現を用いる。

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

 ア 01001100

 イ 10100101

 ウ 10100110

 エ 11010011


■解答■
  二種午前平成11年秋問4

 
> 5.625を2進数で表すと
> 0101.1010
> 2の補数だから、足すとちょうど
> 10000.0000になるもの、つまり
> 反転したものに0.0001を足した
> ものになる、と考えて解きました。

 どうもありがとうございました。

>マイナスだと最初のビットが1であると考えてアは違う。
>残り、イ、ウ、エで考えて小数点が4ビット目と5ビット目の間とすると
>イ、ウも整数部が5にはならないので違う。
>残りのエが正解。
>という風に考えました。

 どうもありがとうございました

(補足)
0101.1010
1の補数は
1010.0101となる
次に2の補数は
1010.0110となる
これが-5.625(10)になるというわけです。
この問題は補数、負数、小数点の複合問題です。


★★★解説:二種向け★(2000/5/10)

 2 進数 10110101 の 8 けたの 2 の補数はどれか。

 ア 01001010

 イ 01001011

 ウ 10110100

 エ 10110110



■解答■(宿題メールより)
  二種午前平成12年春問5

 イ 01001011

> 2の補数は10110101を反転させて1と加えます。
> 01001010 + 1 = 01001011

 どうもありがとうございました。もう一度,反転させて1を加えると?
アレっていう感じですよ。コインでいうと裏表の関係でした。

>  1 0 1 1 0 1 0 1 を1の補数(反転)させると
>  0 1 0 0 1 0 1 0になります。
>  2の補数はそれに+1をするので
>  0 1 0 0 1 0 1 1 になります。

 どうもありがとうございました。

> 8けたの2進数の2の補数は2^8-10110101。
> 2進数に変換すると、2^8=100000000。
> よって、100000000-10110101=01001011

 どうもありがとうございました。

 2の補数の作り方は,反転させて+1ですので,10110101 の2の補数は,
最初の数字は,0 最後の数字が 1 で,答えは,イしかないですね。

>コンピュータ内部で負の数を「2の補数」で表現するのは、減算を
>加算で行えるからである。
>(コンピュータ・エージ社「2種共通テキスト1 ハードウェア」
>  p.40より)

 どうもありがとうございました。
 反転させて+1数を,再度,反転させて1を加えると?
アレっていう感じですよ。コインでいうと裏表の関係でした。だから,減算が
加算になるのでしょう。


★★★宿題:二種(基本情報技術者)向け★(2000/8/23)

 2 進数の表現で,2 の補数を使用する理由はどれか。

 ア 減算を加算処理で行うことができる。

 イ 最下位ビットで,正数と負数が判断できる。

 ウ 除算を減算の組合せで処理できる。

 エ ビットの反転によって,負数を求めることができる。


(解答)

10進数の10−10を考えて見ましょう。

PCは2進数表現しかできないから上記計算は2進数に変換して行います。
10進数  2進数
 10 → 0101
ー10 → 1011 求め方はいちばん上の説明を読んでください。

10-10→01011011=10000=0 となります
                 ↑ 
                この1ははみ出し、無視される。
つまり、2の補数を利用することにより減算を加算で行うことができます。

■解答■
  一種午前平成12年問4

> 負数の表し方〜
>http://axion.ee.uec.ac.jp/~cvs/ic2/note/complement.html

 どうもありがとうございました。

> 減算を加算と同じ回路で行うためでしょうか。
> そして、1の補数では +0 と -0 ができてしまうので。
>
> http://hts.iprs.sfc.keio.ac.jp/%7Ehts/data/jtext/b3-4.html
>  「 (1)入力機能  数の2元符号化 」の説明を参考にしました。
>
> http://pegasus.cs.shinshu-u.ac.jp/%7Eyizawa/logic/chap9/chap9.html
> 組合せ回路について参考にしました。

 どうもありがとうございました。