負の数の2進数表現の
まとめ第二弾は、1バイトで
2進数を表現する方法についてです。
ホワイトボードの板書とともに
説明していきましょう。
1バイトは8bitでしたね。
ということは、
2の8乗=256
の情報を表現できます。
ですから、負でない(0以上の)
10進数であれば、
0~255までを表すことができますね。
さて、ここでバイキンマ~ンが登場し、
アンパンチ君にこう言います。
「いいか。世の中は
陰と陽で成り立っているんだぜ。
だから俺たちダークサイドの世界にも
半分よこせ」
アンパンチ君は了解し、
1バイトの領域の半分をダークサイド、
つまり負の数に割り当てることにしました。
具体的には、
-128から-1までを割り当てます。
ここまでをホワイトボードの板書で
示しておきます。

では、負の数をどのように
2進数で表現すればよいでしょうか。
例えば小さい数から順に
00000000=-128
00000001=-127
00000010=-126
・
・
・
11111111=127
などと割り当てればいいかというと、
確かに大小関係は保存されますが
これでは足し算のルールが
乱れてしまってマズイことになります。
負の数を定義するためには、
正の数の反数を考えること、
つまり和がゼロとなるような
ペアを考える必要があります。
そうです。世界はすべからく
陰陽で成り立つのです(笑)
そこで捻りだしたのが、
0を00000000とするのではなく、
100000000と、9桁にして表そう
というアイデアです。
8bitから桁がオーバーフローした部分は
その桁を「落とす」ということです。
こうすると、-1は、1の反数なので
00000001に対して
桁を反転させて11111110とし、
そこに1を足した11111111
を対応させれば良いことがわかります。
このようにして
-128から127までを表したのが
次の図です。

先頭ビットが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コマ漫画で表しましたね。

オマケの話題を一つ。
11010111という1バイトの数は
一般的には、
128+64+16+4+2+1=215
を表します。
一方、これを負の数の補数表現と見ると、
反転させ
00101000
1を加えて
00101001
これを10進数にすると
32+8+1=41
つまり、11010111は
-41を表します。

因みに、215から2の8乗の256を引くと
215-256=-41
ちょっと数学的な表現をすると
215≡-41 (mod 256(8bit))
ってこと。
今回はここまでっ!
トラックバックURL:
http://simomath.blog.fc2.com/tb.php/1606-ab308f5a