64位整型的定义方式


  • long long定义方式可以用于gcc/g++,不受平台限制,但不能用于VC6.0。
  • __int64是Win32平台编译器64位长整型的定义方式,不能用于Linux。
  • “%lld”用于Linux i386平台编译器,”%I64d”用于Win32平台编译器。
  • cout只能用于C++编译,在VC6.0中,cout不支持64位长整型。


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

    首先是如果我们在自己机器上写程序的话,情况分类如下:

    (1) 在win下的VC6.0里面,声明数据类型的时候应该写作

    __int64 a;

    输入输出的时候用 %I64d

    scanf(”%I64d”,&a);
    printf(”%I64d”,a);

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

    long long a;

    输入输出时候用 %lld

    (3) 在win下的其它IDE里面[包括高版本Visual Studio],数据类型声明用上面两种均可

    输入输出用 %I64d



  • 首先要说的是,和Java等语言不同,C/C++本身并没有规定各数据类型的位数,只是限定了一个大小关系,也就是规定从所占的bit数来说,short <= int <= long <= long long。至于具体哪种类型占用多少位,是由你所用的开发平台的编译器决定的。在现在的PC上一个通常的标准是,int和long同为32位,long long为64位。但是如果换到其它平台(如ARM)上,这个数字可能会有不同,类型所占的大小可以用sizeof()运算符查看。

    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了。

    关于使用printf的输入输出,这里就有一个更囧的情况。实际上只要记住,主要的区分在于操作系统:如果在win系统下,那么无论什么编译器,一律用%I64d;如果在linux系统,一律用%lld。这是因为MS提供的msvcrt.dll库里使用的就是%I64d的方式,尽管Dev-Cpp等在语法上支持标准,但也不得不使用MS提供的dll库来完成IO,所以就造成了这种情况。



  • 那么对ACMer来说,最为关心的就是在各个OJ上交题应分别使用哪种方式了。其实方式只有有限的几种:

    如果服务器是linux系统,那么定义用long long,IO用%lld
    如果服务器是win系统,那么声明要针对编译器而定:
    + 如果用MS系列编译器,声明用__int64 [现在新版的Visual Studio也支持long long了]
    + 如果用MinGW环境,声明用long long
    + 无论什么编译器,IO一律%I64d

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

    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编译器[支持两种声明]

    如果有不太清楚的情况可以先看看各OJ上的FAQ,通常会有说明。

    另外,为了避免混乱,当数据量不大时,用cin, cout进行输入输出也是一种选择


  • 来自http://blog.csdn.net/hongxdong/article/details/5559312
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值