|
作戦を考えてみたんですけども、まずはオーバーフローの気にないようにする
ために、文字列化された数値の足し算/引き算をするサブルーチンを別途用意し
ます。例えば"123"という文字列と"456"という文字列を、文字列のままで数値的
に足し算して、"579"って文字列を返すような、そういうサブルーチンを作りま
す。そういうのが1つあれば、あとはオーバーフローは気にしないで計算出来ま
す。
それで、問題の数値ですが、問題の数値から0x80000000を引いてやればオー
バーフロー状態を脱するので、まずはそうしてやってかち文字列に変換し、そこ
からは文字列同士の足し算関数で、0x80000000を10進数化した"2147483648"を
足してやります。
そうすると正しい値が出ます。
サンプルマクロは以下の通りです。ちょっと長いですけども、サブルーチンと
しては、ConvertSpositiveValって関数に数値を渡してやって、結果が$$return
で返ってくるという、ただそれだけで使えます。
//テスト
#x = 0x7FFFFFFF;
while(1) {
call ConvertPositiveVal #x;
question "0x" + hex(#x) + " == " + $$return;
if( result != yes ) {
break;
}
#x = #x + 1;
}
endmacro;
//こっちが目的のサブルーチン
ConvertPositiveVal:
if( ##1 >= 0 ) {
return str(#x);
}
##positive = ##1 - 0x80000000;
$$s1 = str(##positive);
$$s2 = "2147483648"; //0x80000000を10進数表記する。
call StringNumberAdd $$s1, $$s2;
return $$return;
StringNumberAdd:
##len1 = strlen($$1);
##len2 = strlen($$2);
$$result = "";
##x = 0;
##overflow = 0;
while( ##x < ##len1 || ##x < ##len2 ) {
if( ##len1 > ##x ) {
##digit1 = val( midstr( $$1, ##len1 - ##x - 1, 1 ) );
} else {
##digit1 = 0;
}
if( ##len2 > ##x ) {
##digit2 = val( midstr( $$2, ##len2 - ##x - 1, 1 ) );
} else {
##digit2 = 0;
}
##sum = ##overflow + ##digit1 + ##digit2;
##overflow = ##sum / 10;
##sum = ##sum % 10;
$$result = str(##sum) + $$result;
##x = ##x + 1;
}
if( ##overflow != 0 ) {
$$result = str(##overflow) + $$result;
}
return $$result;
|
|