2016年10月5日水曜日

2進数表現(負数の表現)

2の補数について

2進数の補数には、1の補数と2の補数という表現方法があるそうです。

1の補数は桁内の最大数を基準とした方法で、2の補数は桁内の最大数+1を基準値とした方法ということだそうです・・・
これだけで理解しろと・・・?

8ビットで1の補数を解説すると、

11111111 ・・・ 8ビットで表現できる最大の数値

これで-12を表現したいとすると、最大の数値から12を引くことで表そうということなので、

 11111111
- 00001100
⇒11110011 ⇒ これを-12とする、というのが1の補数の考え方

同様に8ビットで2の補数を解説すると、

11111111+1を最大値として表現するので、
100000000 の9ケタで表現しますよっと

  100000000
- 000001100
⇒011111111 - 000001100 + 1 ・・・ 100000000を011111111と1に分解すると全桁反転させて表現できる
⇒011110011 + 1
⇒011110100
⇒9ビット目は仮に存在する桁なので、11110100が-12を表現することになるということだが、今いち意味が分からない・・・www

つまり、上の解説は1の補数、2の補数の考え方を述べているだけで、実際の数字を表す手法の解説ではないということを念頭に置かなければならない・・・と、こう考えることができるのは次の解説でわかる。

「最上位ビットで正・負の判断を・・・」

8ビットで正負両方の数を考えた場合、最上位8ビット目を正負の符号と考え、0の場合は正、1の場合は負とする。そのうえで、表現できる数を簡単な一覧にすると

01111111 ・・・ +127
01111110 ・・・ +126



00000011 ・・・ +3
00000010 ・・・ +2
00000001 ・・・ +1
00000000 ・・・ 0
11111111 ・・・ -1
11111110 ・・・ -2
11111101 ・・・ -3



10000000 ・・・ -128

この表現方法で表現できる数値の範囲は$-2^{n-1}$~$2^{n-1}-1$となる。nに8を代入すると$-2^7$~$2^7-1$で、-128~127となり上の表と合致する。

逆に符号が正の場合は単純な加算処理を行えば表現している数字はわかる。

たとえば、「00001100」は最上位ビットが0なので正であり、4の桁($2^2$)と8の桁($2^3$)を足した値、つまり10進数で「12」を表しているとみることができ、

符号が負の場合は最上位ビットを除くビットが表現している値から、与えられている桁数の最大値を引くことで表現している数字がわかる。

たとえば「10001100」は最上位ビットが1なので負であり、4の桁($2^2$)と8の桁($2^3$)を足した値、つまり10進数で「12」から最大値「128」を引いた「-116」を表していることがわかる。

参考書はここでまとめとして、3つの負数を表現する方法の違いを述べている。

1.符号と絶対値 ⇒ 最上位ビットを符号とし、それ以外は絶対値で表現する
2.1の補数
3.2の補数

・符号と絶対値及び1の補数の場合、表現できる範囲が ($-2^{n-1}-1$)~($2^{n-1}-1$)
・符号と絶対値及び1の補数の場合、2つの「0」が存在する

・2の補数で表現できる範囲は($-2^{n-1}$)~($2^{n-1}-1$)
※2の補数を用いることで、減算を負数の作成と加算処理で行えるため、ハードウェアの演算回路を単純化できる

・・・ つまりここまで言ってたことは、ハードウェアの演算回路を単純化するために考えられた表現方法だったということか・・・・ 早く言ってほしいwww

しかし、ここまでで全743ページ中22ページしか進んでいない orz
根本的な考え方を変えないといつまでたっても終わらないな・・・

0 件のコメント:

コメントを投稿