★2進数について★


進数の話」で10進数や2進数、8進数、16進数の考え方を書きましたが、念のため2進数の考え方をもう少し書いておきます。


まず、10進数のおさらいです。

10進数 1234 は、

    1の位 が 4 個 =    4
   10の位 が 3 個 =   30
  100の位 が 2 個 =  200
 1000の位 が 1 個 = 1000

これを全て加算した値でした。

1の位から「位」が10倍ずつ増えているのがわかります。

それぞれの位が「何個あるか」で数が変わります。

それぞれの位の個数は「0〜9」までです。

※1の位が14個と指定できてしまうと12314となり、位の区別がつかなくなります。

この場合、10の位が1個と1の位が4個となり、いわゆる桁上がりをして、1244となります。


では、2進数です。

とりあえず、2進数に関する用語の説明をしておきます。

2進数の1桁を「ビット(bit)」と言います。

2進数8桁(8ビット)で「1バイト(Byte)」という単位になります。

例えば、2進数「1100 1001」というデータは、「8ビット」であり、「1バイト」の情報です。

また、「100 100」の左端のビット(赤色)を「最上位ビット」、右端のビット(青色)を「最下位ビット」と呼びます。


あまり大きな数を扱うと混乱してしまいますので、まずは4bit(2進数4桁)で考えてみましょう。

2進数 1011 は10進数で考えると、

 1の位 が 1個 = 1
 2の位 が 1個 = 2
 4の位 が 0個 = 0
 8の位 が 1個 = 8

これを全て加算した、11(10進数)となります。

1の位から「位」が2倍ずつ増えているがわかります。

それぞれの位が「ある(1)か無い(0)か」で数が変わります。

それぞれの位の個数は「0か1」です。


4bitで表現できる値を全て書いてみます。

 2進数    10進数

 0000 →  0
 0001 →  1
 0010 →  2
 0011 →  3
 0100 →  4
 0101 →  5
 0110 →  6
 0111 →  7
 1000 →  8
 1001 →  9
 1010 → 10
 1011 → 11
 1100 → 12
 1101 → 13
 1110 → 14
 1111 → 15

ここで使用する2進数はunsigned型(符号なし)を想定しています。

マイナスについての考え方(signed型)は後述します。


次に8bit(2進数8桁)の場合を考えてみます。

これはC言語のchar型と同じサイズです。

2進数「1111 1000」を10進数で考えると、

   1の位 が 0個 =   0
   2の位 が 0個 =   0
   4の位 が 0個 =   0
   8の位 が 1個 =   8
  16の位 が 1個 =  16
  32の位 が 1個 =  32
  64の位 が 1個 =  64
 128の位 が 1個 = 128

これを全て加算した、248(10進数)となります。


4bitの時と同じく、マイナスを考えずに表現できる数(unsigned型)を書きます。

 2進数     10進数

 0000 0000 →   0
 0000 0001 →   1
 0000 0010 →   2
 0000 0011 →   3
 0000 0100 →   4
 0000 0101 →   5
   ・
   ・
   ・
 1111 1000 → 248
 1111 1001 → 249
 1111 1010 → 250
 1111 1011 → 251
 1111 1100 → 252
 1111 1101 → 253
 1111 1110 → 254
 1111 1111 → 255

途中省略していますが、0〜255の数が表現可能です。

※2進数を4桁ずつ区切るのは「見やすく」するためです。(他の意味もありますが、またの機会にしましょう)


さて、C言語でのchar型は8bitのサイズしかありませんから、8bitを超える数は表現できません。

が、あえて8bitを超える数を代入した場合はどうなるのでしょうか?


unsigned char型(符号なし)で考えてみます。

10進数 300 を 2進数に直すと、

 1 0010 1100

となります。

※10進数から2進数への変換はコラム「基数変換」をご確認ください。

桁を数えると、9bitになりますね。


詳しく見ると、

   1の位 が 0個 =   0
   2の位 が 0個 =   0
   4の位 が 1個 =   4
   8の位 が 1個 =   8
  16の位 が 0個 =   0
  32の位 が 1個 =  32
  64の位 が 0個 =   0
 128の位 が 0個 =   0
 256の位 が 1個 = 256

これらを全て加算したら、300(10進数)になりますね。

つまり、10進数「300」は、8bit(2進数8桁)に収まらないのです。


収まらなかった場合、次のようになります。

各ビットを収納する箱をイメージしてください。

下に書いてある数値は「位」です。

  +−+−+−+−+−+−+−+−+
  | | | | | | | | |
  +−+−+−+−+−+−+−+−+
   128 64 32 16  8  4  2  1

これに、10進数 300 を、2進数で代入してみます。

  +−+−+−+−+−+−+−+−+
 1|0|0|1|0|1|1|0|0|
  +−+−+−+−+−+−+−+−+
   128 64 32 16  8  4  2  1

一番左のビットがはみ出しています。

「箱」に収まらず、左にはみ出したビットは「切り捨て」られます。


「切捨て」た後に、残ったビットを見てみましょう。

  +−+−+−+−+−+−+−+−+
  |0|0|1|0|1|1|0|0|
  +−+−+−+−+−+−+−+−+
   128 64 32 16  8  4  2  1

残ったビットを10進数にすると・・・44ですね。

やっと<sample program col013-02>の結果にたどり着きました。

型の表現範囲を超えた数値を代入した場合、「思ったとおりに表示されない」というよりは、「サイズに収まりきらない部分が切り捨てられた数値が表示」されているのです。


まだ<sample program col013-01>は説明できていませんが、これを説明するには2進数でのマイナス表現を理解する必要があります。

では、「マイナスの表現」を見てみましょう。


ブラウザの戻るボタンで戻ってください。