★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バイト」の情報です。
また、「1100 1001」の左端のビット(赤色)を「最上位ビット」、右端のビット(紫色)を「最下位ビット」と呼びます。
あまり大きな数を扱うと混乱してしまいますので、まずは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進数でのマイナス表現を理解する必要があります。
では、「マイナスの表現」を見てみましょう。
ブラウザの戻るボタンで戻ってください。