【小中学生向け夏休みの自由課題つき】コンピュータ内部での数字表現 | yet another 舞鶴電脳工作室

yet another 舞鶴電脳工作室

 京都府舞鶴市で、舞鶴電脳工作室(cyber Work Shop in Maizuru)と言う、プラモデル/ラジコン/鉄道模型/電子部品/街角工作室そしてプログラミング教室の店をやっています。いろいろ雑多な絵日記風のブログですが、よろしくお願いします。

±符号あり(!?)の7セグメントLEDのデモ

秋葉原のスーパージャンクというジャンク屋さんで買ってきた7セグメントLEDは、なんと+記号が表示できます。普通の7セグメントLEDの真ん中に縦に短い二つの追加セグメントがあるのです。ピンを調べてみると、数字としては「1」だけが表示できるようです。ですので、意味のある表示は「+.-.+1,-1」と言ったところですね。
 この動画では、同じくスーパージャンクで買ったロータリバイナリスイッチで、4bitで表現できる数字を10進数で表示してみました。2進数では、最上位ビットが符号を表しますので、ロータリバイナリスイッチの「0」は「+0」と表示されます。2進数はマイナスの数は「2の補数」で表現されます。例えば10進数の「1」は2進数の「0001」ですが、10進数の「-1」は2進数の「1111」です。なぜかというと、10進数の「+1」と「-1」を足すと「0」になりますが、2進数の「0001」と「11111」を足すと「10000」となります。一番上の「1」は桁あふれなので無視すると「0000」で「0」だというわけです。と言うことで、計算機は基本的に演算は加算器で実現され、引き算は2の補数で、掛け算は足し算を繰り返すこと、割り算は引き算を繰り返すことで実現されます。
 私(町田)は舞鶴高専電子制御工学科3年生に、このような「計算機工学」を教えています。

 


【小中学生向け夏休みの自由課題】コンピュータ内部での数字表現

●ディジタルとは?
 皆さんが使っている、電卓やスマホやパソコンは「電子計算機」の一種です。もちろん、ディジタルの計算機です。
 ディジタルとはどういうことかと言うと、(スイッチの)ONとOFFだけで表現するということです。算数(数を数える)では、ONを「1]、OFFを「0」と分かりやすくなります。

●2進数で大きな数を表現する
ただ、0と1だけだと2種類しかないので不便です。大きな数を表すには0と1を並べます。つまり桁を作ります。つまり、「0」の次は「1」、その次は桁上がりして「10」です。注意したいのは「10」は「十(じゅう)」ではなく「イチゼロ」と読みます。これを2進数と言います。普段使っている10進数と2進数の対応関係は次のようになります。

10進数 2進数  
   0      0
   1      1
   2     10
   3     11
   4    100
   5    101
   6    110
   7    111
   8   1000
   9   1001
  10   1010
  11   1011
  12   1100 
  13   1101
  14   1110
  15   1111


ここで、2進数の一桁(ひとけた)をビット(bit)と言います。
もうひとつ気を付けて欲しいのは、あらわる数の範囲です。
1ビットで表せる数は(0,1の)2つ、
2ビットで表せる数は(0,1,2,3の)4つ、
3ビットで表せる数は(0,1,2,3,4,5,6,7の)8つ、と言うように倍倍(ばいばい)になるので、
4ビットで表せる数は16個です。
上の表を良く見ると、最小値は0で、最大値は1ビットなら1、2ビットなら3、3ビットなら7、4ビットなら15、なのですが、2進数ならばそれぞれ、「1」、「11」、「111」、「1111」と全て「1」になっていますね。

●最下位ビットと最上位ビット
 さて、2進数で大きな数を表せることが分かりましたが、各桁は一番下(右側から)、第0ビット、第1ビット、第2ビット、第3ビットと数えます(後で取り扱いが楽なので)。
 その最下位ビットすなわち第0ビットは、何を意味しているのか分かりますか? 上の表を縦に見ると、最下位ビット(第0ビット)は、0,1,0,1,,, と交互に0と1が変わっていますね。と言うことは10進数との比べてみると、そう!(ポンとひざをたたく)、偶数奇数を表しているのですね(0は偶数だということがこれで分かります。)
 それでは最上位ビットは何を表しているのでしょうか? 上の表を良く見てみると分かるのですが、「数の大小」を意味しています。
2ビットならば2以上だと最上位ビット(第1ビット)は1、3ビットならば4以上だと最上位ビット(第2ビット)は1、4ビットならば8以上だと最上位ビット(第3ビット)は1、になって、それ未満は0ですね。
 英語では、最上位ビットをMSB(Most Significant Bit)、最下位ビットをLSB(Least Significant Bit)、と言います。


●負(マイナス)の数の表現
 それでは負(マイナス)の数は、どうやって表現するかと言うと、2進数はマイナスの数は「2の補数」で表現します。例えば10進数の「1」は(4ビットの)2進数の「0001」ですが、10進数の「-1」は2進数の「1111」です。なぜかというと、10進数の「+1」と「-1」を足すと「0」になりますが、2進数の「0001」と「1111」を足すと「10000」となります。一番上の「1」は桁あふれなので無視すると「0000」で「0」だというわけです。と言うことで、計算機は基本的に演算は加算器で実現され、引き算は2の補数で、掛け算は足し算を繰り返すこと、割り算は引き算を繰り返すことで実現されます。

●補数の作り方
 補数と言うのは、足せばその数になると言うことです。
例えば「1の補数」では、
 「0」の1の補数は「1」
 「1」の1の補数は「0」
です。0は1に、1は0になりますね。これを(0,1の)反転と言います。
では、「2の補数」では、
 「0」の2の補数は「2」
 「1」の2の補数は「1」
ですね。えっ、ちょっと待ってください。2進数は0か1しかつかえないんだったらダメじゃん!!
なので、「2の補数」は「1の補数」に「1を足す」ことで計算します。
たとえば、「-1」は2の補数表現では、
(1) -1の-(マイナス)をとって+1とする。
(2) 「+1」を4ビットの2進数にすると「0001」です。
(3) 1の補数を計算するために「0001」を反転すると「1110」になり、
(4) 2の補数を計算するために、それに1を加えると 「1111」になります。
---
例題: 4-3 を計算してみる。
4-3は、4+(-3)のことですね。そこで-3の「2の補数表現」を考えてみます。
(1) -3の-(マイナス)をとって+3とする。
(2) 「+3」を4ビットの2進数にすると「0011」です。
(3) 1の補数を計算するために「0011」を反転すると「1100」になり、
(4) 2の補数を計算するために、それに1を加えると 「1101」になります。
それでは4(2進数では0100)と足してみましょう。
    4  = 0100
+ (-3) = 1101
---------------
        10001
答えの一番上(5桁め、第4ビット)はけたあふれなので無視して4ビットにおさめると、答えは「0001」で「4-3=1」は確かに計算できています。
 上の筆算は、初めてだとわかりずらいですが、第0ビットは0と1を足すと答えは1、第1ビットは0と0を足すと答えは0、第2ビットは1と1を足すと答えは桁上がり1と0(つまり10)、そして第3ビット(最上位ビット)は0と1と桁上がりの1を足すと答えは(10)、になります。

このように、ディジタル計算機は基本的に演算は加算器で実現され、引き算は2の補数で、掛け算は足し算を繰り返すこと、割り算は引き算を繰り返すことで実現されます。

私(町田)は舞鶴高専電子制御工学科3年生に、このような「計算機工学」を教えています。

 

4ビットの2の補数の2進数の10進数の対応関係は次の通りです。

10進数 2進数  
   0    0000
   1    0001
   2    0010
   3    0011
   4    0100
   5    0101
   6    0110
   7    0111
  -8   1000
  -7   1001
  -6   1010
  -5   1011
  -4   1100
  -3   1101
  -2   1110
  -1   1111

 

+7 (二進数では0111)です。

+6 (二進数では0110)です。

+5 (二進数では0101)です。

+4 (二進数では0100)です。

+3 (二進数では0011)です。

+2 (二進数では0010)です。

+1 (二進数では0001)です。

+0 (二進数では0000)です。

-1 (十六進数ではF、二進数では1111)です。

-2 (十六進数ではE、二進数では1110)です。

-3 (十六進数ではD、二進数では1101)です。

-4 (十六進数ではC、二進数では1100)です。

-5 (十六進数ではB、二進数では1011)です。

-6 (十六進数ではA、二進数では1010)です。

-7 (十六進数では9、二進数では1001)です。

-8 (十六進数では8、二進数では1000)です。

実は -8 は「例外」なのが良くわかります。絶対値が3ビットでは表せないからですね。数字の7セグメントLEDは3ビットの絶対値表現です。

 

おまけ、4ビットの2進数から、符号ビットと3ビットの(絶対値の)2進数への変換回路

 

EDA(Electronics Design Automation)ツール:ディジタル回路設計自動化アプリ、によるシミュレーション結果。EDAはIntel(ALTERA)のQuartusIIです。FPGA(現場で買い替えられる大規模IC)用のEDAツールです。ですから、FPGAに書き込めます。すごくシンプルになるでしょう。

 

ですから、FPGAに書き込めます。すごくシンプルになるでしょう。でも、もちろんゲートIC(小規模IC)で配線して実現できます。最後はコスト(部品の総価格)、そして面積、納期、いろいろな面から評価しないといけません。