__int64与long long

  • 时间:
  • 浏览:0
  • 来源:UU快3—全天最准大发快三

上表中,正确指编译通过,运行详细正确;错误指编译真是 通过,但运行结果有误;无法编译指编译器根本不到编译完成。观察上表,亲戚亲戚大伙儿儿可需要发现以下几点:

zz from http://blog.csdn.net/zhlynn/archive/509/03/28/4032152.aspx

另有:

(1) 在win下的VC6.0中间,声明数据类型的之前 应该写作

//为了和DSP兼容,TSint64和TUint64设置成TSint40和TUint40一样的数  

可能性服务器是linux系统,那末定义用long long,IO用%lld

可能性服务器是win系统,那末声明要针对编译器而定:

+ 可能性用MS系列编译器,声明用__int64 [现在新版的Visual Studio也支持long long了]

+ 可能性用MinGW环境,声明用long long

+ 无论那些编译器,IO一律%I64d

__int64与long long 就有在32位平台开始英语 英文使用的64位整数的数据类型,在存储最好的办法和使用最好的办法上那末区别。

两者的区别在于,它们命名的发起人不同,支持的平台不同。long long有些数据类型,是UNIX平台发起并支持的,而__int64是微软从win95(VC6)开始英语 英文发起并支持的,在老的windows开发平台下(如VC6),不识别long long,而老的UNIX,全都识别_int64。当然,现在比较新的平台,你这俩数据格式和相关的定义、函数都可需要兼容了。同样,作为64位整数的printf输出格式定义,也是一样,微软使用的是%i64d,而UNIX使用的是%lld以及%llu(无符号64位)等形式。实际上,无论哪你这俩,在实际效果上那末不同,全都可能性定义者和使用环境造成的支持或不支持的问题图片。而ACM中,编译识别系统偏向更多的支持微软系统的定义,全都应该使用__int64和%i64d

以下是对有些混乱请况的解释,如无兴趣可需要跳过

本文讨论的是你这俩常用的C/C++编译器对64位整型的支持,这你这俩编译器分别是gcc(mingw32),g++(mingw32),gcc(linux i386),g++(linux i386),Microsoft Visual C++ 6.0。可惜的是,那末你这俩定义和输出最好的办法组合,共同兼容这你这俩编译器。为彻底弄清不同编译器对64位整型,我写了进程运行对它们进行了评测,结果如下表。

zz from http://www.byvoid.com/blog/c-int64/

表中最后一行输出最好的办法中的printint64()是我有些人写的另一一三个白函数,可需要看出,它的兼容性要好于有些所有的输出最好的办法,它是一段那末 的代码:

1. TOJ : Linux系统

2. ZOJ : Linux系统

3. POJ : Win系统,语言如选择C/C++,则用MS编译器[支持你这俩声明],如选择GCC/G++,则为MinGW

4. UVa : Linux系统

5. Ural: Win系统,MS编译器[支持你这俩声明]

6. SPOJ: Linux系统

7. SGU : Win系统,MS编译器[支持你这俩声明]

在C/C++中,64为整型另一一三个白劲是你这俩那末选择规范的数据类型。现今主流的编译器中,对64为整型的支持也是标准不一,价值形式各异。一般来说,64位整型的定义最好的办法有long long和__int64你这俩(VC还支持_int64),而输出到标准输出最好的办法有printf(“%lld”,a),printf(“%I64d”,a),和cout << a你这俩最好的办法。

__int64 a;

首很难说的是,和Java等语言不同,C/C++你这俩并那末规定各数据类型的位数,全都限定了另一一三个白大小关系,也全都规定从所占的bit数来说,short <= int <= long <= long long。至于具体哪种类型占用好多个位,是由你所用的开发平台的编译器决定的。在现在的PC上另一一三个白通常的标准是,int和long同为32位,long long为64位。全都可能性换到其它平台(如ARM)上,有些数字可能性会有不同,类型所占的大小可需要用sizeof()运算符查看。

输入输出用 %I64d

那末对ACMer来说,最为关心的全都在各个OJ上交题应分别使用哪种最好的办法了。真是 最好的办法不到有限的几种:

================== 以下可无视 =========================

关于使用printf的输入输出,这里就有另一一三个白更囧的请况。实际上假若记住,主要的区分在于操作系统:可能性在win系统下,那末无论那些编译器,一律用%I64d;可能性在linux系统,一律用%lld。这是可能性MS提供的msvcrt.dll库里使用的全都%I64d的最好的办法,尽管Dev-Cpp等在语法上支持标准,但全都得不使用MS提供的dll库来完成IO,全都就造成了有些请况。

可能性有不太清楚的请况可需要先看看各OJ上的FAQ,通常会有说明。

输入输出的之前 用 %I64d

==================== 无视至此 ===========================

long long是C99标准中新引进的数据类型,在古老的VC6.0中并那末有些类型,全都在VC6.0中用”long long”会趋于稳定编译错误。为了表示64位整数,VC6里采用的是微软有些人搞出来的另一一三个白数据类型,叫做__int64,全都可能性你是在VC6.0下编译句子,应该用__int64定义64位整型。新版的Visual Studio可能性支持long long了。GCC是支持long long的,亲戚亲戚大伙儿儿在win系统中使用的其它IDE如Dev-Cpp, Code::Blocks等等大多是采用的MinGW编译环境,它是与GCC兼容的,全都也支持long long(另外为了与MS兼容,也支持__int64)。可能性是在纯的linux下,就不到使用long long了。

输入输出之前 用 %lld

(2) 在linux下的gcc/g++中间,数据类型声明写作

有些写法的本质是把较大的64位整型拆分为另一一三个白32位整型,全都依次输出,低位的偏离 要补0。看似很笨的写法,效果怎样才能?我把它和cout输出最好的办法做了比较,可能性它和cout就有C++支持跨平台的。首先printint64()和cout(不清空缓冲区)的运行结果是详细相同的,之前 出現错误。我的试验是分别用两者输出50000个随机数,实际结果是,printint64()在1.5s内跑完了进程运行,而cout需要2s。cout要稍慢有些,全都在输出极少量数据时,要尽量解决使用。

(3) 在win下的其它IDE中间[包括高版本Visual Studio],数据类型声明用中间你这俩均可

long long a;

另外,为了解决混乱,当数据量不大时,用cin, cout进行输入输出也是你这俩选择

64位整数全解(增补板) 

  

64位整形引起的混乱主要在两方面,一是数据类型的声明,二是输入输出。

scanf(”%I64d”,&a);

printf(”%I64d”,a);

首先是可能性亲戚亲戚大伙儿儿在有些人机器上写进程运行句子,请况分类如下:

下面把各大OJ请况列表如下: