†REXXのどろぬま†

16進文字列の誤認識

作成開始日 2014.10.25
最終更新日 2014.10.30

「0E」や「00E」などで始まる16進文字列はREXXに誤認式され、IF文での比較が正常に行われないことがある。たとえば;
IF 0E320060 = 0E704641 THEN …
IF 0E320060 = 00E15353 THEN …
などは《真》となってしまう。原因は、REXXがこれらの文字列を指数形式(ENGINEERING)の《数値》と看做してしまうため。「E」に先行する数字がすべて「0」であれば、指数部の値に拘らず、数値としては0になる。つまり、上記の例は、共に「IF 0 = 0 THEN…」として処理されているわけだ。もちろん、これらの値を変数に入れて比較しても、まったく同じ現象が起きる。と言うより、上記模擬コードのように直に比較することは、現実にはありえない。

では、数値と看做されなけば良いのだから、

IF "0E320060" = "0E704641" THEN …
のように文字列であることを明示すれば良いのかと言うと、残念ながらこれもダメ。REXXは中味を自動的に判別して、勝手に数値に変換した上で比較を実行する。このIF文もやはり《真》となってしまう。型概念のないREXXの仕様上の欠点と言ってよいだろう。

このような現象が起きる条件は;

@文字列が「数字E数字」形式であること。「E」以外の文字や記号が含まれていると、自動的な数値化はされない。また、「E」が2回以上含まれている場合も数値化されない。

A「E」に先行する数字が「0」のみからなっていること。他の数字が含まれていると、たとえ数値化されても値が0にはならないので、特別な場合を除いてイコールにはならない。たとえば、「1E2」と「10E1」はともに100を意味するのでイコールになってしまうが、こうした偶然は滅多に起きないだろう。

したがって、この問題に対処するには、文字列の先頭や末尾に適当な記号や英字をくっつければ良い。例えば;

IF "$0E320060" = "$0E704641" THEN …
IF "0E320060X" = "0E704641X" THEN …
ならば、きちんと《偽》になる。つまり、16進文字列は;
CALL LINEIN inp, hex_st
hex_st='$'hex_st
のように下処理をした上で使用することが必要。


【REXXのどろぬま目次】 【ホーム】