「進数の話」で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進数でのマイナス表現を理解する必要があります。
では、「マイナスの表現」を見てみましょう。
ブラウザの戻るボタンで戻ってください。