fc2ブログ

「負の数の2進数表現」

負の数の2進数表現の
まとめ第二弾は、1バイトで
2進数を表現する方法についてです。

ホワイトボードの板書とともに
説明していきましょう。

1バイトは8bitでしたね。

ということは、
2の8乗=256
の情報を表現できます。
ですから、負でない(0以上の)
10進数であれば、
0~255までを表すことができますね。

さて、ここでバイキンマ~ンが登場し、
アンパンチ君にこう言います。

「いいか。世の中は
陰と陽で成り立っているんだぜ。
だから俺たちダークサイドの世界にも
半分よこせ」

アンパンチ君は了解し、
1バイトの領域の半分をダークサイド、
つまり負の数に割り当てることにしました。

具体的には、
-128から-1までを割り当てます。


ここまでをホワイトボードの板書で
示しておきます。

2sinminus003.jpg

では、負の数をどのように
2進数で表現すればよいでしょうか。

例えば小さい数から順に
00000000=-128
00000001=-127
00000010=-126



11111111=127

などと割り当てればいいかというと、
確かに大小関係は保存されますが
これでは足し算のルールが
乱れてしまってマズイことになります。

負の数を定義するためには、
正の数の反数を考えること、
つまり和がゼロとなるような
ペアを考える必要があります。

そうです。世界はすべからく
陰陽で成り立つのです(笑)

そこで捻りだしたのが、
0を00000000とするのではなく、
100000000と、9桁にして表そう
というアイデアです。

8bitから桁がオーバーフローした部分は
その桁を「落とす」ということです。

こうすると、-1は、1の反数なので

00000001に対して
桁を反転させて11111110とし、
そこに1を足した11111111
を対応させれば良いことがわかります。

このようにして
-128から127までを表したのが
次の図です。

2sinminus004.jpg

先頭ビットが0の時が正の数、
1の時が負の数を表しています。

この先頭ビットは
「符号ビット」と呼ばれます。

このようにすることで、
矛盾なく反数ペアを網羅でき、
加算回路だけで計算を
賄うことができるわけです。

では一つ練習してみましょう。

-27を1バイトで2進数表現するには
どうすればよいか考えましょう。

まず、27を2進数表現します。

27=16+8+2+1なので
11011となりますね。

でも1バイトなので0を付加して、
00011011
とします。

これの相方(反数)を考えるわけですね。

反転させて
11100100

1を足して
11100101

これが-27の1バイト上での
2進数表現です。

これを負の数の補数表現といいます。

確認しましょう

00011011+11100101=100000000

和が定義された0となったので
OKですね。

授業ではこの様子を
下のような4コマ漫画で表しましたね。

2sinminus002.jpg

オマケの話題を一つ。

11010111という1バイトの数は
一般的には、
128+64+16+4+2+1=215
を表します。

一方、これを負の数の補数表現と見ると、

反転させ
00101000

1を加えて
00101001

これを10進数にすると
32+8+1=41 
つまり、11010111は
-41を表します。

2sinminus001.jpg

因みに、215から2の8乗の256を引くと
215-256=-41

ちょっと数学的な表現をすると
215≡-41 (mod 256(8bit))
ってこと。

今回はここまでっ!





 

コメント

コメントの投稿

  • URL
  • コメント内容
  • password
  • 秘密
  • 管理者にだけ表示を許可する

トラックバック

トラックバックURL: http://simomath.blog.fc2.com/tb.php/1606-ab308f5a