int の変数に入っている数値を 10進数に変換したい。 同様に __int64 とかも変換したい。
さて、変換必要な文字バッファは何文字確保すれば?
いやまぁ、TCHAR szBuff[1024]; とかすればマズ大丈夫だろーとは思うのですが、気分的に「適当」というのが嫌な訳で。何かしらの方法で、安全な桁数を保証したいわけです。将来的に __int2048 とかにも対応するように!(マジか
で、最初に思いついたのが、マクロを利用する方法でした。
INT_MIN なり LONG_MAX なり _I64_MAX なり、各型の最大値・最小値がライブラリとして保証されている(ハズ)です。 ただし、コレ等は数値ですので、そのままでは桁数を算出できません。 そこで、こんな仕掛けを組んで見ました。
#define D9ArrayLength(x) (sizeof(x) / sizeof(x[0]))
#define D9ComputeLength(n) D9ArrayLength(#n) // 文字列化
int nIntLen = D9ComputeLength(INT_MIN); // 符号ついてるほうが長い
int nUIntLen = D9ComputeLength(UINT_MAX);
おおお、これいい感じに算出できね?もしかして、これキタ?キターーー?
/* minimum (signed) int value */
#define INT_MIN (-2147483647 - 1)
/* maximum unsigned int value */
#define UINT_MAX 0xffffffff
_| ̄|○
わたしゃー、 "(-2147483647 - 1)" とか "0xffffffff" とかいう文字列の長さが知りたいんじゃ無いんじゃぁぁぁーーーーー!ヽ(`Д´)ノ
で、仕方ないので別アプローチを探してみると numeric_limits::digits10 なるものがあることに気づくわけですが……(続く)