マシン語で数値を unsigned として扱って文字列化

数値を 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 )になりますのでそれを文字列反転しています。あらかじめ何桁になるか分かっていたらこんなことはしなくていいでしょうが...。もっと良い方法あるのかな?

インフォメーション

公開日時
2007年12月24日 午後7時31分36秒
最終更新日時
2007年12月24日 午後7時34分50秒
カテゴリ
HSP