Microsoft Visual C++ 不支持long long

在C/C++中,64为整型一直是一种没有确定规范的数据类型。现今主流的编译器中,对64为整型的支持也是标准不一,形态各异。一般来说,64位整型的定义方式有long long和__int64两种(VC还支持_int64),而输出到标准输出方式有printf(“%lld”,a),printf(“%I64d”,a),和cout << a三种方式。

本文讨论的是五种常用的C/C++编译器对64位整型的支持,这五种编译器分别是gcc(mingw32),g++(mingw32),gcc(linux i386),g++(linux i386),Microsoft Visual C++ 6.0。可惜的是,没有一种定义和输出方式组合,同时兼容这五种编译器。为彻底弄清不同编译器对64位整型,我写了程序对它们进行了评测,结果如下表。

变量定义 printf输出方式 gcc(mingw32) g++(mingw32) gcc(linux i386) g++(linux i386) MicrosoftVisual C++ 6.0
long long “%lld” 错误 错误 正确 正确 无法编译
long long “%I64d” 正确 正确 错误 错误 无法编译
__int64 “lld” 错误 错误 无法编译 无法编译 错误
__int64 “%I64d” 正确 正确 无法编译 无法编译 正确
long long cout 非C++ 正确 非C++ 正确 无法编译
__int64 cout 非C++ 正确 非C++ 无法编译 无法编译
long long printint64() 正确 正确 正确 正确 无法编译

这里注意我标示的蓝色部分,大写的L和大写的I一定要区分清楚

上表中,正确指编译通过,运行完全正确;错误指编译虽然通过,但运行结果有误;无法编译指编译器根本不能编译完成。观察上表,我们可以发现以下几点:

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

表中最后一行输出方式中的printint64()是我自己写的一个函数,可以看出,它的兼容性要好于其他所有的输出方式,它是一段这样的代码:

void printint64(long long a)
{  if (a<=100000000)  printf("%d/n",a);  else  {  printf("%d",a/100000000);  printf("%08d/n",a%100000000);  }
}  

这种写法的本质是把较大的64位整型拆分为两个32位整型,然后依次输出,低位的部分要补0。看似很笨的写法,效果如何?我把它和cout输出方式做了比较,因为它和cout都是C++支持跨平台的。首先printint64()和cout(不清空缓冲区)的运行结果是完全相同的,不会出现错误。我的试验是分别用两者输出1000000个随机数,实际结果是,printint64()在1.5s内跑完了程序,而cout需要2s。cout要稍慢一些,所以在输出大量数据时,要尽量避免使用。

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

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进行输入输出也是一种选择

Microsoft Visual C++ 不支持long long相关推荐

  1. Microsoft Visual C++下载,VC++下载

    Microsoft Visual C++ 2019 v14.28.29617 Microsoft Visual C++ Redistributable(系统运行库,简称MSVC,VB/VC)是Wind ...

  2. DCMTK 3.6.2(MD支持库)与Microsoft Visual Studio 2017开发环境的搭建

    DCMTK 3.6.2(MD支持库)与Microsoft Visual Studio 2017开发环境的搭建 DCMTK 362MD支持库与Microsoft Visual Studio 2017开发 ...

  3. 微软提供对汉语拼音的强大升级支持--Microsoft Visual Studio International Pack 1.0 SR1

    下载地址: http://www.microsoft.com/downloads/details.aspx?FamilyID=44CAC7F0-633B-477D-AED2-99AEE642FC10& ...

  4. 未安装c 的vs语言支持,microsoft visual c++2015安装时出现问题,显示已安装这个产品的另外一个版本。...

    安装diamond,需要microsoft visual c++2015REdistributable(*64)环境. 那么问题来了,在安装microsoft visual c++2015REdist ...

  5. 下一版本Windowsreg; CE 开发工具Smart Device Extensions for Microsoft Visual Studioreg; .NET...

    初识 Smart Device Extensions Larry Roof Tonked.com 2001年10月23日 上个月我曾说过我会前往 Microsoft 学院,了解下一版本的小型工具的情况 ...

  6. 使用Microsoft Visual Studio International Pack获得中文字符串的所有拼音组合(处理多音字)...

    最近一个项目中客户需要做人名的拼音检索,就像QQ好友那样,输入拼音就提示符合的联系人.上网找了一下,发现微软已经发布了相关的支持库,不仅可以处理拼音,还能处理笔画.简繁体转换等.csdn上有一篇博客介 ...

  7. 让Visual Studio 也支持JS代码折叠 [ Visual Studio | #region | #endregion ]

    前言 Visual Studio的代码折叠功能非常好用,#region #endregion 这个词连搜狗的词库里面都出现了(不含'#'号),可见使用频率很高,但是他不支持js的代码折叠 : ( 最近 ...

  8. MICROSOFT VISUAL STUDIO COMMUNITY 2015软件许可条款

    MICROSOFT VISUAL STUDIO COMMUNITY 2015 这些许可条款是 Microsoft 公司(或您所在地的 Microsoft 公司的关联公司)与您之间达成的协议.这些条款适 ...

  9. Microsoft Visual Studio Learning Pack 2.0

    一个比较有意思的教学插件,推荐给辛勤的老师们. Microsoft Visual Studio Learning Pack 2.0 (上一版的名字是 Microsoft VisualStudio Ch ...

最新文章

  1. HTML5 开发APP
  2. 问题集合---《平时遇到的问题 + 参考解决方式》
  3. 【学习笔记】Django
  4. 音视频技术开发周刊 | 180
  5. 推荐系统整体框架概览
  6. 10月21日下午PHP常用函数
  7. SQLAlchemy Transactions
  8. JavaScript数据结构学习笔记(封装二叉树)
  9. Linux安装GCC 9.2.0
  10. 公布几个设备的sysObjectId取值
  11. html设置一级标题二级标题格式怎么弄,word如何设置一级二级三级标题格式
  12. 第六届CCF计算机职业资格认证考试题解(C++)
  13. 卷积神经网络(CNN)详解
  14. 虚拟机里博图能连接上实物PLC,但是HMI仿真不能连接实物PLC
  15. 安装虚拟机 vmware
  16. Android开发过程中的一些基本常识
  17. 【漏洞通告】Gitlab存在多个高危漏洞
  18. 极限题型一:求函数极限常见题型
  19. 2068. 整数拼接
  20. 浅谈消防应急照明系统在建筑电气设计领域的实践

热门文章

  1. batchelor包去除单细胞RNA-seq数据批次效应
  2. 物体检测之从RCNN到Faster RCNN
  3. 字典怎么增加元素_python3基础之字典
  4. JAVA基础13-Java抽象方法、抽象类、抽象之模板方法模式
  5. 学计算机专业需要考的证有哪些科目,自考计算机专业的考试科目有哪些?
  6. 机器人启示录 百度影音_机器人启示录游戏下载-机器人启示录安卓版 v1.2.0_5577安卓网...
  7. windows10下mysql-8.0.21的安装和使用
  8. 【linux】lsof的常用命令汇总
  9. 【keras】rnn中的LSTM
  10. 华为p30如何把计算机放进通知栏,华为p30短信来了在通知栏怎么不显示