V8で%EVALでの計算結果の有効範囲は-2147483647~2147483647で
4バイト(符号の1ビット+31ビット)になります。
計算結果がこれを超えるとオーバーフローを起こします。
下記のようになります。
_/_/_/_/_/_/_/_/_/_/ program _/_/_/_/_/_/_/_/_/_/
%LET num1 = %EVAL(2147483646 + 1) ;
%PUT num1 : &num1 ;
%LET num2 = %EVAL(2147483646 + 2) ;
%PUT num2 : &num2 ;
%LET num3 = %EVAL(-2147483646 - 1) ;
%PUT num3 : &num3 ;
%LET num4 = %EVAL(-2147483646 - 2) ;
%PUT num4 : &num4 ;
_/_/_/_/_/_/_/_/_/_/_/ log _/_/_/_/_/_/_/_/_/_/
3274 %LET num1 = %EVAL(2147483646 + 1) ;
3275 %PUT num1 : &num1 ;
num1 : 2147483647
3276 %LET num2 = %EVAL(2147483646 + 2) ;
ERROR: オーバーフローが発生しました。計算を中止します。
3277 %PUT num2 : &num2 ;
num2 :
3278 %LET num3 = %EVAL(-2147483646 - 1) ;
3279 %PUT num3 : &num3 ;
num3 : -2147483647
3280 %LET num4 = %EVAL(-2147483646 - 2) ;
ERROR: オーバーフローが発生しました。計算を中止します。
3281 %PUT num4 : &num4 ;
num4 :
また、%IF~%THENでの値の比較に関しても、
片方の値が-2147483647~2147483647を超えるとオーバーフローします。
下記のようになります。
_/_/_/_/_/_/_/_/_/_/ program _/_/_/_/_/_/_/_/_/_/
%macro test1 ;
%let test1 = 2147483647 ;
%if &test1 = 100000 %then %do ;
%put 条件一致 ;
%end ;
%else %do ;
%put 条件不一致 ;
%end ;
%mend ;
%test1;
%macro test2 ;
%let test2 = 2147483648 ;
%if &test2 = 100000 %then %do ;
%put 条件一致 ;
%end ;
%else %do ;
%put 条件不一致 ;
%end ;
%mend ;
%test2;
_/_/_/_/_/_/_/_/_/_/_/ log _/_/_/_/_/_/_/_/_/_/
3282 %macro test1 ;
3283 %let test1 = 2147483647 ;
3284 %if &test1 = 100000 %then %do ;
3285 %put 条件一致 ;
3286 %end ;
3287 %else %do ;
3288 %put 条件不一致 ;
3289 %end ;
3290 %mend ;
3291 %test1;
条件不一致
3292 %macro test2 ;
3293 %let test2 = 2147483648 ;
3294 %if &test2 = 100000 %then %do ;
3295 %put 条件一致 ;
3296 %end ;
3297 %else %do ;
3298 %put 条件不一致 ;
3299 %end ;
3300 %mend ;
3301 %test2;
ERROR: オーバーフローが発生しました。計算を中止します。
ERROR: マクロ TEST2 の実行を中止します。
※ "="の部分は"^="、">"、">="、"<"、"<="でも同様です。
つまり、マクロプロセッサに計算させる場合、
有効な値は-2147483647~2147483647の4バイトになります。
ちなみに、%EVALでオーバーフローする場合は、%SYSFUNC(SUM())で対処できます。
また、%IF~%THENでオーバーフローする場合は、マクロ変数をダブルクォーテーションで括ることで、対処できます。
[google]
0 件のコメント:
コメントを投稿