现在的位置: 首页 > 综合 > 正文

C++的64位整数 __int64 (zz)

2014年02月05日 ⁄ 综合 ⁄ 共 1065字 ⁄ 字号 评论关闭

  在做
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"

抱歉!评论已关闭.