● 出力文字数について

数値を文字列に変換する時は、結果を格納する領域を確保しておかなければなりませんが、正確なバイト数を確保する場合は事前に調べなければなりません。独自の文字列変換処理を用意し、変換した文字をバッファに蓄えずに printf 等で標準出力へ送る方法もありますが、Windows コントロールや標準入出力以外の I/O に出力する場合は、都合が良くありません。

文字列変換は比較的低速なので、正確な文字数が意味を持つ処理以外では、「最大値・最小値の文字数」の方法を推奨します。空間を効率的に使用できなくても、最近のPCならさほど問題にはなりません。
    char         buf[64];  ← 通常のプログラムでも、事前に出力サイズが判らない場合、「結
                              果を全て受け取る事ができる大凡のサイズ」でバッファを確保す
            ・                る事がありますが、原理的にはこれと同じです。
            ・
            ・

    sprintf(buf,"結果:%s\n",pszResult);

            ・
            ・
            ・
毎回最大値・最小値の文字数を調べるようにすると、かなり時間が掛かってしまうので、別のツールで先に調べておくと、実際のプログラムに文字列長調査を実装せずに済みます。
例.最大文字列長を調べるツール
    数値幅が大きいと時間が掛かります

#include <stdio.h>
#include "fixedX.h"
#include "fixutil.h"

#define BIT           128
#define SIZE          (BIT / 8)

#define RADIX         10       /* 調査対象の基数 */

void        main(void )
{
    FIXEDVAL        test[SIZE],work[SIZE];
    int             cnt;

/* 符号付きの場合は SIGNEDVAL を定義してください */
#ifdef SIGNEDVAL

    /* 負の最大値 */
    memset(test,0,SIZE-1);
    test[SIZE-1] = 0x80;

    cnt = fixedutil_signed_num2str_cntsize(test,SIZE,RADIX,work);
#else

    /* 絶対値の最大 */
    memset(test,0xff,SIZE);

    cnt = fixedutil_unsigned_num2str_cntsize(test,SIZE,RADIX,work);
#endif
    printf("文字数:%d\n",cnt);
}


10進数の最大文字列長(末尾ヌル分を含まず).
変数の数値幅
(bit)
signed 最大文字列長
(バイト)
unsigned 最大文字列長
(バイト)
321110
642020
1284039
2567878
512155155
1,024309309
2,048618617
4,0961,2341,234
8,1922,4672,467
16,3844,9334,933
32,7689,8659,865
65,53619,73019,729
131,07239,45839,457
262,14478,91478,914
524,288157,828157,827
1,048,576315,654315,653
2,097,152631,307631,306
4,194,3041,262,6131,262,612
8,388,6082,525,2242,525,223
※ signed には符号分を含みます。


基数によっては、最大文字数をもう少し簡単に求める事ができます。例えば 2進数の場合、数値幅のビット長が最大表示文字数になりますので、128bit では 128 + 1 = 129 バイト以上のバッファを用意すれば良い事が判ります。16進数の場合は 1 バイトを 2文字で表現するので、128 ÷ 8 × 2 + 1 = 33 バイト以上のバッファを用意すれば良い事になります。