的64位整数[元]by赤兔正文转自http://www.cn itblog.com/cockerel/archive/2006/08/16/15356.html
做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编译器的扩展。
VCVC6.0的64位整数分别称为__int64和unsigned __int64,其范围分别为[-2 ^ 63,2 ^ 63 ]和[ 0,2 ^ 64 ],- 92233720364 64位和32位混合运算会将32位整数隐式转换为64位整数。 但是,VC的输入输出与__int64的兼容性不好。 如果编写了这样的代码:
1 __int64a;
2 cin a;
3 cout a;
那么,在第二行中,“errorc 26793360 binary ' ' : nooperatordefinedwhichtakesaright-handoperandoftype ' _ int 64 ' (orthereisno )” 第三行接收“错误259: ' operator ' is ambiguous”错误。 那个不能输入输出吗? 当然,也可以用C的写法:
scanf('%I64d ',a );
printf('%I64d ',a ); 就可以正确输入输出了。 如果要使用unsigned __int64,则可将“I64d”更改为“I64u”。
OJ通常使用g编译器。 其64位扩展方式与VC不同,分别被称为长龙和无符号长龙。 处理规模与输入输出以外的使用方法相同。 关于输入输出,扩展性比VC高。 哪个都可以使用
1龙龙;
2 cin a;
3 cout a; 也可以使用
scanf('%lld ),a );
printf('%lld ',a );
如果要使用无符号数字,请将“%lld”更改为“%llu”。
在最后添加。 作为特例,如果使用的是Dev-C的g编译器,请使用“%I64d”而不是“%lld”。