C++的64位整数

  • Post author:
  • Post category:其他






在做




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”