ACM中关于__int64与long long 的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM中关于__int64与long long 的区别相关的知识,希望对你有一定的参考价值。

在做hdoj 1019 的时候 碰到一个奇怪的问题 当我把变量定义为long long 型的时候会出现 runtime error(好像是里面出现除以0的情况),但是把long long 全改成 __inti64 就ac了,哪位大牛给我解释一下啊
runtime error的程序:
#include<iostream>
using namespace std;
int main()

__int64 s,a,b,n,i,t,tmp;
scanf("%lld",&t);
while(t--)

scanf("%lld",&n);
scanf("%lld",&a);
s=a;
for(i=1;i<n;i++)

scanf("%lld",&b);
s=a*b;
long long tt;
while(b!=0)

tmp=b;
b=a%b;
a=tmp;

a=s/a;

printf("%lld\n",a);

return 0;

ac的程序:
#include<iostream>
using namespace std;
int main()

__int64 s,a,b,n,i,t,tmp;
scanf("%I64d",&t);
while(t--)

scanf("%I64d",&n);
scanf("%I64d",&a);
s=a;
for(i=1;i<n;i++)

scanf("%I64d",&b);
s=a*b;
long long tt;
while(b!=0)

tmp=b;
b=a%b;
a=tmp;

a=s/a;

printf("%I64d\n",a);

return 0;

还有那个runtime error的程序 把输入输出改成cin cout 是可以ac的,为什么啊?
runtime error的程序是这个,一开始问题里发错了:
#include<iostream>
using namespace std;
int main()

long long s,a,b,n,i,t,tmp;
scanf("%lld",&t);
while(t--)

scanf("%lld",&n);
scanf("%lld",&a);
s=a;
for(i=1;i<n;i++)

scanf("%lld",&b);
s=a*b;
long long tt;
while(b!=0)

tmp=b;
b=a%b;
a=tmp;

a=s/a;

printf("%lld\n",a);

return 0;

__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
参考技术A 因为我们用的系统都是32位,所以在编译器中,int是32位,long long和__int64都是64位的,因此用哪个都行,相信我!你的问题出在,不论是long long还是__int64,如果你用printf输出,都必须用printf("%I64d\n",a)表示,千万不能用lld,用lld肯定错,你用cout就不会有这个困扰,这也就是为什么用cout能ac的原因。同理,建议你scanf最好你也别用lld,用%I64d。本回答被提问者采纳 参考技术B long long 在不同的系统中长度不一样。C语言有这样的约定:sort 两个字节,long 四个字节,int 则处在两者之间并随编译器不同而不同。没有直接对long long 定义,因而它的长度也是变化的(四个或八个字节)。而__int64 则是64位的。然而,__int64 也是没有直接定义的。在有些编译器中__int64 不可用(例如 eclipse),而有些编译器中 long long 不可用(例如 visual C++6.0)。所以我们在编译程序时应当先熟悉(可以使用sizeof() 来测试)编译器。 参考技术C long long 是32位的,__int64是64位的
他们的数的范围不一样啊
__int64 范围更大
参考技术D 我感觉是 scanf("%lld",&标识符 ); 有问题,你可以用 "%ld" 试一下。

既然你用的是C++,那么你可以用 cin 来接收输入的数据。

还有,并不是所有变量都需要64位来存储。

VC2008如何将Cstring转成long型?

由于宽字符的问题,之前的atol,sscanf,_wtol都转不了,请问有什么函数可以将cstring转换成long?
记得之前有个类似于strscanf的函数可以转,但不记得准确的函数名。回复请贴真正可行的办法,谢谢!!
找到原因,原来是字符串是十六进制的所以转换不了,用_stscanf _T(%x)可以行,但用vc2008推荐用swscanf_s,说更安全。谢谢zxd.

参考技术A 如果不是宽字符的,用sscan,如果是宽字符,用_stscanf。例如:
CString str;
long int ldata;
str = _T("655350");
_stscanf(str, _T("%ld"), &ldata);本回答被提问者采纳

以上是关于ACM中关于__int64与long long 的区别的主要内容,如果未能解决你的问题,请参考以下文章

int ,long , long long, __int64等类型的范围

使用非固定整数(int、long)而不是固定大小的整数(int64_t、int32_t)有啥好处吗?

_int64

关于C语言 的__int64 的:如何输出从键盘读入的__int64 变量 问题

不能将 uint64_t 与 rdrand 一起使用,因为它需要 unsigned long long,但 uint64_t 被定义为 unsigned long

unsigned long long 与 uint64_t 冲突? [复制]