いろきゅうのブログ

はてなダイアリーから移行中…

桁数を調べたい!

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 なるものがあることに気づくわけですが……(続く)