eraシリーズ改造/バリアント開発の覚え書き

NULLを使いたい


関数の引数に数値を渡すときに、「0」を意味のある値として扱いたい場合があると思う。
たとえば「引数としてRGB値を渡すときに、何も渡さなかったらコンフィグに設定されている色をデフォルトの色として使う」というような関数があったときに、引数が0だったら、0x000000を渡されたのか、コンフィグの値を使って欲しいのか区別が付かない。
こういうときは、引数のデフォルト値として-1を使うとよい。色の範囲は0x000000〜0xFFFFFFまでだから、-1(0xFFFFFFFFFFFFFFFF)はこの値の範囲外になる。

問題は、負数もゼロも引数の値の範囲に含みたい場合である。上のケースは、使わない値の範囲を別の値として代用するというアイデアだ。Emueraでは数値は64bit符号付整数型として扱うが、もし64bit符号付整数の範囲の値すべてを使いたい、という場合があったとしたら……それはもうあきらめるしかないだろう。
が、おそらく大半のケースでは64bit符号付整数の範囲の値すべてを使いたいということはないだろう。64bit符号付整数の最大値は9,223,372,036,854,775,807で、最小値は-9,223,372,036,854,775,808である。この最小値の方がなかなかクセもので、たとえば以下のコートは動かない。

PRINTV -9223372036854775808

上のコードは、たぶん以下のように解釈される。

PRINTV -1 * 9223372036854775808

*演算子の右辺値9223372036854775808は64bit符号付整数の最大値を超えている。なるほどこれは動かない。
もし-9223372036854775808なる値を扱いたいなら、以下のように書く。

PRINTV 0x8000000000000000

-9223372036854775808と表示されたことと思うが、これは何を意味しているのか。
たとえば0x8000000000000000に-1を掛けると-9223372036854775808になる(-1 * 0x8000000000000000 == 0x8000000000000000は真になる)。
たとえば0x8000000000000000の絶対値を求めると例外が発生する。
つまり、「64bit符号付整数として負の数から0も正の数まですべての数値を使いたい」というニーズがあったとしても、最小値たる-9223372036854775808は絶対値が最大値よりも1大きいのでまともに使えない、ということである。
なるほどまともに使えない値があるということは、それこそなんらかの値の代用として使えなくもないだろう。

@FUNCTION_HOGE, ARG, ARG:1=0x8000000000000000
    IF ARG:1 == 0x8000000000000000
        ARG:1 = GET_DEFAULT_HOGE_VALUE()
    ENDIF

さすがにこんなに長い値を毎回書いていたら疲れてしまう。
var1.8.0.8で追加されるERHには#DEFINEマクロがあるので、それを使うといいだろう。

; ERH
#DEFINE NULL 0x8000000000000000

; ERB
@FUNCTION_HOGE, ARG, ARG:1=NULL
    IF ARG:1 == NULL
        ARG:1 = GET_DEFAULT_HOGE_VALUE()
    ENDIF

欠点は、この値をsavファイルに保存するとばかみたいに容量を食ってしまうところだろう。savファイルはテキストデータなので、桁数が増えれば増えただけ容量は増す。この値は64bit符号付整数の最大桁数になるので、当然テキストデータ化したときの容量としても最大になる。決して保存される変数すべての値をこの値で初期化しておこうなどとは思わないことである。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

リンク

漠々ト、獏
eramaker/eramaker2の開発元の公式サイト。

Emuera - emurator of eramaker
C#で書かれたeramakerのエミュレータ「Emuera」のプロジェクトページ。

eraシリーズを語るスレ まとめ
eraシリーズ全般のまとめ。バリアント情報、改造情報など。

eratoho まとめ
eramakerのバリアント「eratoho」のまとめ。

era板
eraシリーズについての掲示板。

サブページ

Rubiera
Bitbucket上のRubieraプロジェクトページ。Rubieraのソースコードのダウンロードはここで。

管理人/副管理人のみ編集できます