__INT64的使用方法
(一) )。
在c中,int与长范围一样,只能表示(-2^31(2^31 )整数,即(-20亿) 20亿)
unsignedint和unsignedlong的范围为(0(2) 32 ),为40多亿。
表示更大的整数时,这两种数据类型很难使用。 在ACM中经常这样处理
的数据类型。 以前我的笨方法是做整形数组,每个a[i]存一个比特,这样就得做加减乘除运算
自己定义。 刚看到网络上的代码,使用__int64,8、8、8字节存储整数,参考了几个句子
章,介绍其范围和使用方法:
*****__int64,范围(-2^63(2^63 )即(-922亿) 922亿) ) )。
********unsigned__int64,范围(0至0~2^64 ),1844亿。
__int64支持四则混合运算和位运算,与int型运算自动转换为__int64型
vc6.0中的输入和输出:
__int64:
scanf('%I64d )、amp; a );
printf('%I64d ',a );
unsigned__int64
scanf('%I64u )、amp; a );
printf('%I64u ',a );
devC中的输入输出:
龙龙a;
a=1000000000000000 ll
请务必输入ll
cina;
出局
scanf('%I64d )、amp; a );
printf('%I64d ',a );
无符号的用法相似。
(二) ) ) ) )。
做ACM的问题时,经常会遇到几个比较大的整数。 一般的内置整数型太小了。
其中long和int的范围为[-2 ^ 31,2 ^ 31 ]、-2147483648~2147483647。 unsigned的范围
[ 0,2 ^ 32 ],即0至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 ],即- 9223372036854775808~9223372036854775807
0至0~18446744073709551615 (约1800亿)。 64位整数的运算与32位整数几乎相同,都是分支的
具有四则运算和位运算等。 如果进行64位和32位混合运算,32位整数将隐式转换为64
位整数。 但是,VC的输入输出与__int64的兼容性不好。 如果编写了这样的代码:
1 __int64a;
2cina;
3couta;
那么,第二行接受“errorc 26793360 binary ' ' : nooperatordefinedwhichtakesaright-hand”
operando ftype ' _ int 64 ' (orthereisnoacceptableconversion )错误; 在第三行接收“error”
C 2593: ' operator ' is ambiguous "错误。 那个不能输入输出吗? 当然,你
可以用C的写法:
scanf('%I64d ',a );
printf('%I64d ',a ); 就可以正确输入输出了。 如果使用unsigned__int64,请将“I64d”更改为“I64u”
不用了。
OJ通常使用g编译器。 其64位扩展方式与VC不同,分别被称为长龙
无符号龙。 处理规模与输入输出以外的使用方法相同。 输入输出时,扩展比
VC很好。 哪个都可以使用
1龙龙a;
2cina;
3couta; 也可以使用
scanf('%lld ),a );
printf('%lld ',a );
如果要使用无符号数字,请将“%lld”更改为“%llu”。
如果使用的是Dev-C的g编译器,请使用“%I64d”而不是“%lld”。