64bit整数
通常C++などで定義されている整数の最大は、intやlongで32bit(4G)であるが、昨今のファイルシステムの事情などを見てもそれ以上の値を扱いたい場合があるのはよくあることである。
そこで使うのが64bit整数。.net frameworkなどでは最初から規定されているが、VC++にあたっては__int64というのを使う。これは色んなところでtypedefやdefineで利用されていて、例えば、LONGLONGは通常__int64である(86用プロセッサ指定_M_IX86が定義されている時)。また、ファイルポジションを扱うためのfpos_tも__int64で定義されている(Microsoft言語拡張指定の場合)。
64bit整数->文字列
文字列への変換は、printfやsprintfやCString::Formatなどフォーマットが使える場合
1 |
printf( "%I64d", n ); |
という風に行う(nは__int64)。例えば、このとき64bit整数にもかかわらず
1 2 3 4 |
__int64 n1 = 1; __int64 n2 = 100; printf( "%d %d", n1, n2 ); |
としてしまった場合、単に「1 0」としか出力されない。0はn1の上位32bitを整数として出力した値である。ちなみに、32bitより大きな値をセットする時、
1 |
__int64 n1 = 100000000000ll; |
というようにllのサフィックス(接尾辞)をつけてもよい。(Visual Studio 2005では、llをつけなくても大丈夫であった)
また、_i64toaなどを使っても出来る。MSDNを参照して
その結果を (_itoa の場合は 33 文字まで、_i64toa および _ui64toa の場合は 65 文字まで) str に格納します。
とのことで、65文字分のバッファを取っておくことが必要のようだ。_i64totなどではテンプレートでバッファサイズも渡されるので安心して使える。10進数文字列に変換する場合、、、
1 2 3 |
__int64 n = 0x1000000000000; TCHAR tc[ 65 ]; _i64tot( n, tc, 10 ); |
文字列->64bit整数
こちらの方はわりと簡単で、_ttoi64や_tstoi64などを使うだけでよい。
1 |
__int64 n = _tstoi64( tc ); |
なお、_ttoi64や_tstoi64はUNICODEかどうかによって_atoi64、_wtoi64あたりに展開される。