在做
ACM
题时,经常都会遇到一些比较大的整数。而常用的内置整数类型常常显得太小了:其中
long
和
int
范围是
[-2^31,2^31)
,即
-2147483648~2147483647
。而
unsigned
范围是
[0,2^32)
,即
0~4294967295
。也就是说,常规的
32
位整数只能够处理
40
亿以下的数。
那遇到比
40
亿要大的数怎么办呢?这时就要用到
C++
的
64
位扩展了。不同的编译器对
64
位整数的扩展有所不同。基于
ACM
的需要,下面仅介绍
VC6.0
与
g++
编译器的扩展。
VC
的
64
位整数分别叫做
__int64
与
unsigned __int64
,其范围分别是
[-2^63, 2^63)
与
[0,2^64)
,即
-9223372036854775808~9223372036854775807
与
0~18446744073709551615(
约
1800
亿亿
)
。对
64
位整数的运算与
32
位整数基本相同,都支持四则运算与位运算等。当进行
64
位与
32
位的混合运算时,
32
位整数会被隐式转换成
64
位整数。但是,
VC
的输入输出与
__int64
的兼容就不是很好了,如果你写下这样一段代码:
1
__int64 a;
2
cin
>>
a;
3
cout
<<
a;
那么,在第
2
行会收到
“error C2679: binary ‘>>’ : no operator defined which takes a right-hand operand of type ‘__int64’ (or there is no acceptable conversion)”
的错误;在第
3
行会收到
“error C2593: ‘operator <<‘ is ambiguous”
的错误。那是不是就不能进行输入输出呢?当然不是,你可以使用
C
的写法:
scanf(“%I64d”,&a);
printf(“%I64d”,a);
就可以正确输入输出了。当使用
unsigned __int64
时,把
“I64d”
改为
“I64u”
就可以了。
OJ
通常使用
g++
编译器。其
64
位扩展方式与
VC
有所不同,它们分别叫做
long long
与
unsigned long long
。处理规模与除输入输出外的使用方法同上。对于输入输出,它的扩展比
VC
好。既可以使用
1
long long a;
2
cin>>a;
3
cout<<a;
也可以使用
scanf(“%lld”,&a);
printf(“%lld”,a);
使用无符号数时,将
“%lld”
改成
“%llu”
即可。
最后我补充一点:作为一个特例,如果你使用的是
Dev-C++
的
g++
编译器,它使用的是
“%I64d”
而非
“%lld”
。