欢迎来到天天文库
浏览记录
ID:39463540
大小:34.00 KB
页数:3页
时间:2019-07-03
《64位整数全解》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、64位整形引起的混乱主要在两方面,一是数据类型的声明,二是输入输出。首先是如果我们在自己机器上写程序的话,情况分类如下:(1)在win下的VC6.0里面,声明数据类型的时候应该写作__int64a;输入输出的时候用%I64dscanf(”%I64d”,&a);printf(”%I64d”,a);(2)在linux下的gcc/g++里面,数据类型声明写作longlonga;输入输出时候用%lld(3)在win下的其它IDE里面[包括高版本VisualStudio],数据类型声明用上面两种均可输入输出用%I64d==================以下可无视==========
2、===============以下是对这种混乱情况的解释,如无兴趣可以跳过首先要说的是,和Java等语言不同,C/C++本身并没有规定各数据类型的位数,只是限定了一个大小关系,也就是规定从所占的bit数来说,short<=int<=long<=longlong。至于具体哪种类型占用多少位,是由你所用的开发平台的编译器决定的。在现在的PC上一个通常的标准是,int和long同为32位,longlong为64位。但是如果换到其它平台(如ARM)上,这个数字可能会有不同,类型所占的大小可以用sizeof()运算符查看。longlong是C99标准中新引进的数据类型,在古老的VC6
3、.0中并没有这个类型,所以在VC6.0中用”longlong”会发生编译错误。为了表示64位整数,VC6里采用的是微软自己搞出来的一个数据类型,叫做__int64,所以如果你是在VC6.0下编译的话,应该用__int64定义64位整型。新版的VisualStudio已经支持longlong了。GCC是支持longlong的,我们在win系统中使用的其它IDE如Dev-Cpp,Code::Blocks等等大多是采用的MinGW编译环境,它是与GCC兼容的,所以也支持longlong(另外为了与MS兼容,也支持__int64)。如果是在纯的linux下,就只能使用longlon
4、g了。关于使用printf的输入输出,这里就有一个更囧的情况。实际上只要记住,主要的区分在于操作系统:如果在win系统下,那么无论什么编译器,一律用%I64d;如果在linux系统,一律用%lld。这是因为MS提供的msvcrt.dll库里使用的就是%I64d的方式,尽管Dev-Cpp等在语法上支持标准,但也不得不使用MS提供的dll库来完成IO,所以就造成了这种情况。====================无视至此===========================那么对ACMer来说,最为关心的就是在各个OJ上交题应分别使用哪种方式了。其实方式只有有限的几种:如果服务
5、器是linux系统,那么定义用longlong,IO用%lld如果服务器是win系统,那么声明要针对编译器而定:+如果用MS系列编译器,声明用__int64[现在新版的VisualStudio也支持longlong了]+如果用MinGW环境,声明用longlong+无论什么编译器,IO一律%I64d下面把各大OJ情况列表如下:1.TOJ:Linux系统2.ZOJ:Linux系统3.POJ:Win系统,语言如选择C/C++,则用MS编译器[支持两种声明],如选择GCC/G++,则为MinGW4.UVa:Linux系统5.Ural:Win系统,MS编译器[支持两种声明]6.SP
6、OJ:Linux系统7.SGU:Win系统,MS编译器[支持两种声明]如果有不太清楚的情况可以先看看各OJ上的FAQ,通常会有说明。另外,为了避免混乱,当数据量不大时,用cin,cout进行输入输出也是一种选择1.int错误经历:自己在作Equiptment Box时,因为输入数据长、宽均是小于50000的整数,因此就使用int来作输入。这本身没有问题,但在求其斜边长时,使用的是sqrt(x * x + y * y),表面看是没有问题,但结果一直是Wrong Answer。 后来将这一行改为pow( (pow(x, 2) + pow( y,3 ) ) , 0.5),就Acc
7、ept了!错误原因:后来经johnbill和hewei的分析,x,y本身没有问题,不会越界,但使用sqrt(x*x + y*y)时,里面的x*x 和 y*y则会超出int范围,造成溢出。而pow会将参数自动转换为double,就不会出错。避免:(1)以后均使用pow进行运算。(习惯) (2)运算时,注意做强行转换。(比较麻烦)(3)不管输入给的类型,直接用double来存储,就不会溢出了。这种方法表面看没有问题,但直到这次比赛,才发现了一个很严重的问题!2、double遇到过的问题错误经历因为 do
此文档下载收益归作者所有