C++中的long long与__int64

 更新时间:2021年11月03日 10:44:39   作者:Coder_LT  
这篇文章主要介绍C++中的long long与__int64,在C++ Primer当中提到的64位的int只有long long,但是在实际各种各样的C++编译器当中,64位的int一直有两种标准.一种是long long,还有一种是__int64,非主流的VC甚至还支持_int64,下面文章将介绍具体内容,需要的朋友可以参考一下

1、long long 和 __int64

C++ Primer当中提到的64位的int只有long long,但是在实际各种各样的C++编译器当中,64位的int一直有两种标准。一种是long long,还有一种是__int64,非主流的VC甚至还支持_int64。

对于一般的C++开发者来说,其实这个问题不那么要紧,因为在实际开发当中,绝大多数情况使用32位的int就足够应付了。很少会出现超过int范围的情况,但是对于算法玩家来说,这是一个必须考量的问题。因为很多题目会故意把范围弄得很大,考察选手对于数据范围的敏感。

关于long long__int64,我们有非常多的问题要讨论,我们一个一个来说。

2、历史遗留问题

首先是聊聊这个问题的背景,为什么会有两种标准呢?这并不是C++的标准不严谨,或者是各大编译器乱来,背后是有一个历史遗留问题的。

long long最早是C99标准引进的,然而VC6.0推出于1998年,在C99标准之前。所以当时微软就自己搞出来一个变量叫做__int64来表示64位整数。很多同学使用的第一个C++的编译器就是VC6.0,所以记得在VC6.0当中要使用__int64而非long long。

既然VC6.0搞出了__int64,那么微软后续的C++版本显然就必须要兼容它。所以在win系统当中,这个__int64的变量类型就一直沿用了下来。当然,由于C++标准的更新,当然最新的visual studio已经支持long long了。

GCC并不是基于windows系统的,自然支持long long。win平台下的一些其他IDE如dev C++ CodeBlocks等也支持long long,因为它们为了和微软的系统兼容,所以也支持__int64。所以一个比较简单的区分方法是,判断编译器运行的操作系统是否是windows,如果是windows使用__int64,否则使用long long

3、cin、cout和scanf、printf的选择问题

这个问题对于C++开发工程师来说同样不是个问题,没有任何选择的必要,无脑用cincout就完事了。但对于算法竞赛玩家来说,这依然是一个要考虑的问题。

因为在算法竞赛当中,尤其是当数据量很大的时候,读入和输出占据的时间是非常可观的。看起来只是cin coutscanfprintf的差别,但是两者的性能差异非常大。

我曾经做过实验,同样的数据,使用scanfprintf的效率大约是cincout的十倍以上。在小数据量的时候当然没有差别,但数据量很大的时候影响非常大。很有可能导致同样的题目,同样的算法,别人通过了,但是我们却超时了的情况。

关于性能差异的原因,主要有两种解释。一种解释是说cin为了与scanf混用,而不用担心指针混乱,加上了绑定,总是会与stdin保持同步。正是这一步操作消耗了大量的时间。同理,cout也会有类似的问题。第二种解释是cout在输出之前会把要输出的内容先存入缓存区,中间多了一个步骤,也会带来性能的降低。

关于cin与stdin同步带来的开销,我们是有办法解决的,只需要在加上这一行代码:

std::ios::sync_with_stdio(false);


这行代码的意思是取消cincoutstdinstdout的指针同步,会使得cincout的性能大大提升,达到和scanfprintf相差无几的程度。当然,更好的方法是使用scanfprintf代替。

而要使用scanfprintf又有一个问题,它们是C语言的标准输入输出方式,需要提供标识符来代表变量的类型,那么问题来了long long__int64的标识符是什么呢?

这个其实一查就知道了,long long的标识符是lld,所以我们使用scanf读入一个long long类型的数写成:

long long a;
scanf("%lld", &a);


__int64的标识符是I64d,注意这里是大写的i,不是l。

__int64 a;
scanf("%I64d", &a);


但是这里面有一个很大的坑点,前面说了,目前在windows平台的编译器已经兼容了long long类型。但是即便如此,在2013年之前的版本里,我们输出的时候还是要使用%I64d,这是因为微软提供的msvcrt.dll库只支持%I64d的方式。相当于从底层上断绝了使用%lld输出的可能。2013年微软修复了这个问题,添加了对 %lld 的支持。

所以比较简单的区分方法就是看操作系统,如果是windows系统,那么一律使用__int64准没错。如果是linux或者是Mac系统,那么统一使用long long

我在网上找到了大神做的总结表,也可以直接参考下表:

变量定义 输出方式 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() 正确 正确 正确 正确 无法编译

到此这篇关于C++中的long long__int64的文章就介绍到这了,更多相关C++ long long __int64内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

注:文章转自微信众号:Coder梁(ID:Coder_LT)

相关文章

  • C++ 实现PE文件特征码识别的步骤

    C++ 实现PE文件特征码识别的步骤

    PE文件就是我们常说的EXE可执行文件,针对文件特征的识别可以清晰的知道该程序是使用何种编程语言实现的,前提是要有特征库,PE特征识别有多种形式,第一种是静态识别,第二种则是动态识别,我们经常使用的PEID查壳工具是基于静态检测的方法。
    2021-06-06
  • C语言实现简易版扫雷小游戏

    C语言实现简易版扫雷小游戏

    这篇文章主要为大家详细介绍了C语言实现简易版扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • C++中的策略模式浅析

    C++中的策略模式浅析

    策略模式属于C++设计模式中行为模式之一,该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。本文将通过示例详细讲解这一模式,需要的可以参考一下
    2023-02-02
  • C语言编写简单的定时关机程序

    C语言编写简单的定时关机程序

    本文给大家分享的是一则C语言编写的简单的定时关机程序,可以设置0-600秒倒计时,有需要的小伙伴可以参考下。
    2016-02-02
  • C语言实现学生信息管理系统(单链表)

    C语言实现学生信息管理系统(单链表)

    这篇文章主要为大家详细介绍了C语言实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Window10下安装VS2022社区版的实现步骤(图文教程)

    Window10下安装VS2022社区版的实现步骤(图文教程)

    很多和同学们在接触c语言的时候都是使用VS,本文主要介绍了Window10下如何安装VS2022社区版的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • C指针原理教程之C内嵌汇编

    C指针原理教程之C内嵌汇编

    在学习 C 语言内嵌汇编的实验过程中,发现内嵌汇编极容易造成段错误。
    2019-02-02
  • C语言实现选择排序、冒泡排序和快速排序的代码示例

    C语言实现选择排序、冒泡排序和快速排序的代码示例

    这篇文章主要介绍了C++中实现选择排序、冒泡排序和快速排序的代码示例,例子带有执行时间统计还可以简单看一下效率对比,需要的朋友可以参考下
    2016-04-04
  • 深入了解c++11 移动语义与右值引用

    深入了解c++11 移动语义与右值引用

    这篇文章主要介绍了c++ 移动语义与右值引用的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-08-08
  • C++的静态成员变量和静态成员函数你了解多少

    C++的静态成员变量和静态成员函数你了解多少

    这篇文章主要为大家详细介绍了C++的静态成员变量和静态成员函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02

最新评论