■ 16進数(実は便利)
プログラミングを始めたばかりの人にとって16進数は、最大のライバルのひとつであると思う。ほぼ間違いなく16進数は嫌われ者であろう。しかし、プログラミング時にはときどき16進数でないとかえってわかりにくい数値というものも存在する。それは例えば色である。CGの世界では大抵色をRGBで表す。WindowsではRGBをそれぞれ0~255の256階調で表して、数値化して色の指定をする。例えば
B=0 G=255 R=255 → 黄色
B=127 G=127 R=127 → 灰色
などで、それぞれ数値化された色は
である。しかし、これらの数値を4桁の16進数(Long型)で表すと
黄色=&H0000FFFF
灰色=&H007F7F7F
になる。最上位の2桁は未使用、次の2桁が青成分を表し、次が緑、最下位の2桁は赤成分を表し、それぞれ&H00~&HFFの幅を持っている。このように16進数を使って表したほうが圧倒的にわかりやすい場合もある。
■ 16進数(色の計算方法)
いままで説明してきたことは、ある程度知識のある人にとっては、あまりにもあたりまえであった。しかしここで説明することは、VB上でハマリになりがちな事なので、まじめに読んでほしい。
色を数値で表すには16進数6桁必要である。例えば
暗い青を表す場合には
16進数で表すと
カラーコードは&H640000である。これを計算するにはBの成分を4桁左にスライドし、Gを2桁スライドして3つの成分を加算する。16進数で表記された数値は16倍すると1桁左にスライドするので、4桁ということは
16×16×16×16=65536倍
65536=&H10000倍
すれば良い。同様にGは2桁スライドだから
&H100倍してやれば良いことになる。
数式で示すと
ということになる。
■ 16進数(注意事項)
さて、実際のコードであるが注意が必要になる。
というように変数を定義する。そこで下のようにコーディングする。
C = &HFF * 65536 + &HFF * 256 + &HFF
このコードはオーバーフローエラーが出てしまうのである。この式では &HFF * 256 の部分が問題なのだ。VBは何も指定していない数値は Integer型 として扱われる。この計算に出てくる数値の &HFFも256も Integer型 の範囲内で収まるのでVBはこの計算を Integer型 で行ってしまうのである。この部分の計算結果は
なので、Integer型の数値の範囲である-32768~32767の範囲に収まらないのでエラーになってしまうのである。ところが
の部分は、65536が既にInteger型の範囲内に収まらないので、最初からLong型で計算されエラーにならないのである。こういった問題を避けるために、上にある色の計算式は
C = &HFF& * 65536 + &HFF& * 256 + &HFF&
にする。数値の後に&をつけるとLong型であるとVBに通知することができるので、オーバーフローは起こらない。内部的に厳密に書くと
&HFF =&H00FF
&HFF& =&H000000FF
というように違った意味になるので注意が必要である。
|