消えると困るのでコピペ
ネタ元
Microsoft Visual C++にはLONGLONGという、 64ビットの整数があります。 その使い方をまとめてみました。 結論からいうと、intやdoubleなど普通の型と同様に扱うことができそうです。 使い方は以下のプログラムを見ればわかるでしょう。 (これはマイクロソフト独自の仕様です)
#include <windows.h> // 必要
#include <stdio.h>
// 定数の宣言の仕方。longで"L"を付けるように、末尾に"i64"を付けます。
LONGLONG man = 10000i64; // 64-bit integer-suffix
LONGLONG oku = 100000000i64;
LONGLONG tyo = 1000000000000i64;
LONGLONG kei = 10000000000000000i64;
int main()
{
LONGLONG a=1;
for(int i=0; i<64; i++) {
// %dの代わりに%I64dにします。同様に%I64X等も可能。
printf("2^%-2d = %20I64d (%016I64Xh)\n",i,a,a);
a *= 2; //四則演算OK
}
// MAXLONGLONGは 922京3372兆0368億5477万5807 です。
printf("MAXLONGLONG = %I64d\n",MAXLONGLONG);
// 実数間のキャストもOK
printf("floatに変換 %f\n",(float)MAXLONGLONG);
printf("再びLONGLONGに %I64d\n",(LONGLONG)(float)MAXLONGLONG);
printf("doubleに変換 %f\n",(double)MAXLONGLONG);
printf("再びLONGLONGに %I64d\n",(LONGLONG)(double)MAXLONGLONG);
return 0;
}
出力結果
2^0 = 1 (0000000000000001h)
2^1 = 2 (0000000000000002h)
2^2 = 4 (0000000000000004h)
2^3 = 8 (0000000000000008h)
2^4 = 16 (0000000000000010h)
2^5 = 32 (0000000000000020h)
2^6 = 64 (0000000000000040h)
2^7 = 128 (0000000000000080h)
2^8 = 256 (0000000000000100h)
2^9 = 512 (0000000000000200h)
2^10 = 1024 (0000000000000400h)
2^11 = 2048 (0000000000000800h)
2^12 = 4096 (0000000000001000h)
2^13 = 8192 (0000000000002000h)
2^14 = 16384 (0000000000004000h)
2^15 = 32768 (0000000000008000h)
2^16 = 65536 (0000000000010000h)
2^17 = 131072 (0000000000020000h)
2^18 = 262144 (0000000000040000h)
2^19 = 524288 (0000000000080000h)
2^20 = 1048576 (0000000000100000h)
2^21 = 2097152 (0000000000200000h)
2^22 = 4194304 (0000000000400000h)
2^23 = 8388608 (0000000000800000h)
2^24 = 16777216 (0000000001000000h)
2^25 = 33554432 (0000000002000000h)
2^26 = 67108864 (0000000004000000h)
2^27 = 134217728 (0000000008000000h)
2^28 = 268435456 (0000000010000000h)
2^29 = 536870912 (0000000020000000h)
2^30 = 1073741824 (0000000040000000h)
2^31 = 2147483648 (0000000080000000h)
2^32 = 4294967296 (0000000100000000h)
2^33 = 8589934592 (0000000200000000h)
2^34 = 17179869184 (0000000400000000h)
2^35 = 34359738368 (0000000800000000h)
2^36 = 68719476736 (0000001000000000h)
2^37 = 137438953472 (0000002000000000h)
2^38 = 274877906944 (0000004000000000h)
2^39 = 549755813888 (0000008000000000h)
2^40 = 1099511627776 (0000010000000000h)
2^41 = 2199023255552 (0000020000000000h)
2^42 = 4398046511104 (0000040000000000h)
2^43 = 8796093022208 (0000080000000000h)
2^44 = 17592186044416 (0000100000000000h)
2^45 = 35184372088832 (0000200000000000h)
2^46 = 70368744177664 (0000400000000000h)
2^47 = 140737488355328 (0000800000000000h)
2^48 = 281474976710656 (0001000000000000h)
2^49 = 562949953421312 (0002000000000000h)
2^50 = 1125899906842624 (0004000000000000h)
2^51 = 2251799813685248 (0008000000000000h)
2^52 = 4503599627370496 (0010000000000000h)
2^53 = 9007199254740992 (0020000000000000h)
2^54 = 18014398509481984 (0040000000000000h)
2^55 = 36028797018963968 (0080000000000000h)
2^56 = 72057594037927936 (0100000000000000h)
2^57 = 144115188075855872 (0200000000000000h)
2^58 = 288230376151711744 (0400000000000000h)
2^59 = 576460752303423488 (0800000000000000h)
2^60 = 1152921504606846976 (1000000000000000h)
2^61 = 2305843009213693952 (2000000000000000h)
2^62 = 4611686018427387904 (4000000000000000h)
2^63 = -9223372036854775808 (8000000000000000h)
MAXLONGLONG = 9223372036854775807
floatに変換 9223372036854775800.000000
再びLONGLONGに 9223372036854775800
doubleに変換 9223372036854775800.000000
再びLONGLONGに 9223372036854775800
64ビットですから、doubleと同じbit幅を持ちます。精度はLONGLONGの方が上なので、 doubleでケタ落ちが起こるのはやむを得ないでしょう。
long で足らないことがたまにあるので、独自のクラスを作ろうかと思っていましたが、 その必要はなさそうです。