追記:16進数について
組込みソフトウェアでは、数値について3種類の表現方法をほぼ同じ割合で使用します。
10進数
ひとつは私たちが日常使用している10進数です。これは主にシステムの仕様や最終的な出力(表示とか)など、人間がわかりやすい表現が必要な場所で使用します。またプログラム中では、ループ制御(次回説明します)などで「何回まわす」といった回数などにも使用されます。
2進数
2進数は、ご存じのとおり0と1だけを使う表現方法です。0、1ときて、2になったら桁上がりして10になります。2進数は、主にハードウェアと密接に関わる場所に登場します。なにせハードウェアは基本的に0か1かで動作しているので、2進数で考えるほうがしっくりくることが多いわけです。
16進数
さて16進数というのは何でしょうか。それはコンピュータのハードウェア資源を無駄なく使ったり、2進数表現をより人間にわかりやすくするための表記方法です。
ハードウェア資源を無駄なく使う
たとえば、10進数ひと桁で最大の値は9ですが、これを2進数で表すと1001です。つまり4桁必要なわけです。当然ハードウェアも4桁分の回路が必要になります。でも、4桁あれば、1001から1010、1011・・・1111とさらに6種類もの情報を表現することができるはずです。これを10進数を拡張して9を越えても桁上がりしないように工夫したのが16進数です。1001(=9)の次は1010(=10)ですが、16進数ではアルファベットを使ってAと表記します。同様に、1011(=11)はB、1100(=12)はC、・・・1111(=15)はFと書きます。そして、次の16でようやく桁上がりします。16で桁上がりするので「16進数」です。つまり16進数で数を数えると、
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F, 10,11,12・・・1E,1F, 20,21,22・・・
となるわけです。
2進数の値をわかりやすく表現表現
もうひとつ、16進数は2進数の値を人間にわかりやすく表現できるという利点があります。たとえば、2進数で1101110000010101って、少なくともぱっと見てどういう値かよくわかりませんね。これを16進数で表現してみましょう。変換するのはとても簡単です。まずは2進数を4桁ごとに分けます。すると、1101 1100 0001 0101と、なります。これを、4桁ごとに16進数に置き換えれば、D C 1 5です。慣れないとこれでもわかりにくいかもしれませんが、少なくとも2進数の16桁の値よりは4桁のほうが見やすいですね。
逆に16進数で表記したものは、2進数でどのような値になるかも容易にわかる利点もあります。8ビットの値で、10進数で125と言われたとき、この値でどのビットが0になっているかすぐわかりますか? たいていのひとはイメージできないと思います。ところがこれを16進数で表現すると、7dとなります。7は0111なので、最上位ビットであるビット7が0です。あと、dは1101なので、ビット1も0であることがすぐわかります。
このように、16進数は10進数の手軽さ(?)で、2進数つまりハードウェアに密着した部分の状態をとてもわかりやすく表現することができる、組込みソフトウェア御用達(ごようたし)の便利な表記方法なのです。
頭に0x
最後になりましたが、C言語では16進数は頭に0x(ゼロ エックス)をつけて表現することになっています。たとえば10進数表現でc = 100 ;という代入文は、16進数を使って書き換えると、c = 0x64 ;となります。
え? なぜ64? と思われた方へ。16進数では、16ごとに桁上がりするきまりです。なので、10進数の100の中に何個「16」があるかを数えれば、桁上がりの回数がわかります。求めるのは割り算をすれば簡単、100÷16=6 余り4です。つまり、上の桁が6で、16に満たない余った値4が下の桁となるわけです。
