C++ 11ではstd::to_string
が導入されているため、1つの実装を確認しました。内部でvsnprintf
を呼び出します。さて、なぜそれは常にサイズパラメータをタイプのサイズの4倍に設定するのですか?
inline string
to_string(int __val)
{ return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(int),
"%d", __val); }
inline string
to_string(unsigned __val)
{ return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
4 * sizeof(unsigned),
"%u", __val); }
inline string
to_string(long __val)
{ return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(long),
"%ld", __val); }
N桁の値の2進数の最大数は、(N * log(10)/ log(2))のceil値です。 10進数の1桁には、ceil(3.32)の2進数、つまり4が必要です。
8ビットのサイズの場合:
Decimals = ceil(8 * Size / 3.32) = ceil(2.41 * Size).
サイン(オーバーヘッドと割り当て)については、次のようになります。
Decimals = 4 * Size.
注:単一のsigned charのsnprintfを使用した変換には、5バイト(符号と終了ゼロを含む)が必要です。サイズが1バイトを超える値の場合、Decimals = 4 * Size
は、十分な大きさの結果を提供します。