数値を unsigned として扱って文字列化 では無理やり文字列の数値を足し算する関数を使ってやりましたが、そもそも unsigned int 型があればこんなことしなくてもいいんだよなー、じゃあ C で作っちゃおう、と。
#include "kernel32.as"
#module
#defcfunc str_from_int int x, int radix, local dest, local dummy, local prm
if( radix < 2 ) : return ""
if( code == 0 ) {
code = $0c244c8b, $8bf63356, $33082444, $2474f7d2, $0afa830c, $c280057d, $8003eb30, $148837c2, $c085460e, $08244489, $048ddd75, $0000c60e, $8bc83b48, $531077f1, $168a188a, $88461e88, $f03b4810, $8b5bf276, $00c35ec1
VirtualProtect varptr( code ), 76, $40, varptr( dummy )
}
sdim dest
prm = x, radix, varptr( dest )
dummy = callfunc( prm, varptr( code ), 3 )
return dest
#global
mes str_from_int( 0, 10 )
mes str_from_int( 0x123abc, 16 )
mes str_from_int( 12345, 10 )
mes str_from_int( 0b101101, 2 )
mes str_from_int( -1, 16 )
mes str_from_int( -1, 10 )
mes str_from_int( -1, 8 )
mes str_from_int( -1, 2 )
char *strFromInt( unsigned int x, int radix, char *dest ) {
int i = 0;
do {
int digitVal = x % radix;
char digit;
if( digitVal < 10 ) {
digit = '0' + digitVal;
} else {
digit = 'A' + digitVal - 10;
}
dest[i] = digit;
i ++;
x /= radix;
} while( x != 0 );
dest[i] = '\0';
{ // reverse
char *left = dest;
char *right = dest + i - 1;
while( left <= right ) {
char tmp;
tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
return dest;
}
下の桁の方から順番に出力されますから、反転された状態( 12345 なら 54321 )になりますのでそれを文字列反転しています。あらかじめ何桁になるか分かっていたらこんなことはしなくていいでしょうが...。もっと良い方法あるのかな?