2010-11-18 4 views
0

私の古いVisual Studio 6では、基本的に次のように見えるitow()が見つかりました。itow()のINT_SIZE_LENGTHは20です、なぜですか?

#define INT_SIZE_LENGTH 20 

wchar_t* _itow(wchar_t*bif, int i, int radix) 
{ 
    char abuf[INT_SIZE_LENGTH]; 
    itoa(abuf, i, radix); 
    // convert_to_wide_char(); 
} 

今、INT_SIZE_LENGTHの定義に注目してください。これはなぜ20に設定されていますか?

int32の最悪の場合は、-4294967295にする必要があります。それは11文字に加えて\ 0です。 (私のバッファは、_itowの呼び出しでは、わずか13で、十分だと思っていました。)

(正のint64は最大20文字、負の最大21です。 32ビットの整数)

私はここに何か不足しているように感じますか?感謝していただきました。

(私はVisual Studio 2008のコードを見て、そこにコードが完全に書き換えられたので、VS6コードはあまり良くないと思います。)

+2

20 'radix'は2になる可能性があるため、確かに*十分ではありません。 – kennytm

+0

少なくともVC8のドキュメントでは、' radix' *は2〜36の範囲になければなりません*。 –

+1

まあ、私はVC6がバグであることを知っていたと思います... – leiflundgren

答えて

3

おそらくそれは非小数を発することができるので、場合radixが10未満です。その後、桁数が増加します。一方、バイナリ出力をサポートするには、INT_SIZE_LENGTHが33である必要があります。

1

MSVCはバグです。ビッグサプライズ。正しい長さ(任意のベースサポート)はsizeof(inttype)*CHAR_BIT/log2(minbase)+2となります。minbaseはサポートする必要がある最小のベースです。もちろん、対数を丸める。

関連する問題