返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中的long long与__int64
  • 567
分享到

C++中的long long与__int64

2024-04-02 19:04:59 567人浏览 薄情痞子
摘要

目录1、long long 和 __int642、历史遗留问题3、cin、cout和scanf、printf的选择问题1、long long 和 __int64 在c++ Prime

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)

--结束END--

本文标题: C++中的long long与__int64

本文链接: https://lsjlt.com/news/156232.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++中的long long与__int64
    目录1、long long 和 __int642、历史遗留问题3、cin、cout和scanf、printf的选择问题1、long long 和 __int64 在C++ Prime...
    99+
    2024-04-02
  • 怎么使用C++中的long long与__int64
    本篇内容介绍了“怎么使用C++中的long long与__int64”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、long long 和...
    99+
    2023-06-25
  • java中long与Long的区别
    java中long与Long的区别是:long是java中的基本数据类型,而Long是java中对象类型;对于Long类型的数据,该数据是一个对象,而对于long类型的数据,该数据是一个基本数据类型,不属于对象。Java的数据类型分为两种:...
    99+
    2021-12-04
    java基础 java long Long 区别
  • C++11的long long是什么
    这篇文章主要讲解了“C++11的long long是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++11的long long是什么”吧!long long类型数据类型long lon...
    99+
    2023-06-19
  • C语言怎么计算long long, long double字节大小
    这篇文章主要讲解了“C语言怎么计算long long, long double字节大小”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言怎么计算long long, long double...
    99+
    2023-06-17
  • c语言中long的作用
    long类型在c语言中用于存储比int类型更大范围的整数。它主要用于:存储超出int范围的整数。存储更高精度的整数,因其通常具有更大的位宽。存储指针变量,其通常需要存储更大的地址值。 ...
    99+
    2024-05-09
    c语言
  • c++中int和long的区别
    int 和 long 都是 c++ 中的整型类型,主要区别在于范围和存储空间:范围:int 为 32 位整数,范围为 [-2^31, 2^31-1];long 为 64 位整数,范围为 ...
    99+
    2024-05-14
    c++ 数据丢失
  • Java中long类型与Long类型的区别和大小比较详解
    前言最近在学习java,接触到了long类型,发现网上这方面的资料较乱,所以决定总结一下,在Java中我们经常要做一些判断,而对于判断的话,用的最多的便是“>”、“==”、“<”的比较,这里我们进行一个Long类型数据和long...
    99+
    2023-05-30
    java long类型 ava
  • Python中的long类型
    昨天晚上重读了下python,当读到数据类型的章节时,作者说在python中可以用long类型以便士为单位计算美国国债.... 让我想起10年前第一次读.netframework时,介绍64bit的优势,可以直接计算美国的国债... 中国...
    99+
    2023-01-31
    类型 Python long
  • java long int的区别
    java long int的区别java中long和int都属于整型,为什么还要细分为long和int两种数据类型呢?这是因为它们代表的大小不一样。具体区别如下:1、区别1 16位系统:long是4字节,int是2字节 32位系统:long...
    99+
    2020-02-26
    java基础 java long int
  • long长事务回滚的模拟与定位
    大型事务的回滚 大型事务的回滚产生非常大的代价,不仅锁定需要的资源,并且消耗的CPU和IO,尤其是IO将极为密集。尤其在KILL大型事务之前检查事务究竟有多大可能是必要的,同时我们也需要知道回滚已经进行了多...
    99+
    2024-04-02
  • Required Long parameter ‘xx‘ is not present,请求的Long类型参数不存在
    目录 第一次测试第二次测试第三次测试第四次测试第五次尝试第六 直接看这里,没有废话本次涉及到的两个注解@RequestParam和@RequestBody 关于前后端交互中传参的问题 起因...
    99+
    2023-08-31
    java json spring
  • 【Java基础】java中Long与String类型相互转换
    一、Long类型 转 String类型 Long 转 String 两种方法: 1:String str = String.valueOf(Long val); 2:String str = Long.toString(Long val);...
    99+
    2023-08-20
    java
  • java中long类型占多少字节
    所谓的占用字节数 就是申请内存的时候所占的空间大小。long 8字节 最小值是 -9,223,372,036,854,775,808(-2^63);最大值是 9,223,372,036,854,775,807(2^63 -1);...
    99+
    2019-09-27
    java入门 long 字节 java
  • 详细谈谈Java中long和double的原子性
    目录前言JVM中对long的操作是不是原子操作?为什么对long的操作不是原子的?在硬件,操作系统,JVM都是64位的情况下呢?总结前言 java中基本类型中,long和double的长度都是8个字节,32位(4字节)处理器对其读写操作无法...
    99+
    2018-10-04
    java中的double java中double类型 java的原子性
  • Mongo中如何使用killOp干掉Long Running Operation
    这篇文章给大家分享的是有关Mongo中如何使用killOp干掉Long Running Operation的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。详解:详解currentO...
    99+
    2024-04-02
  • oracle中long2 varchar怎么把long转换为varchar2
    这篇文章主要介绍“oracle中long2 varchar怎么把long转换为varchar2”,在日常操作中,相信很多人在oracle中long2 varchar怎么把long转换为varchar2问题上...
    99+
    2024-04-02
  • 如何使用后端的Long型参数
    本篇内容介绍了“如何使用后端的Long型参数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、问题描述最近在改造内部管理系统的时候, 发现了...
    99+
    2023-06-16
  • springMvc异步的DeferredResult long polling应用方法
    本篇内容介绍了“springMvc异步的DeferredResult long polling应用方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望...
    99+
    2023-06-29
  • 关于FastJson long 溢出问题的小结
    目录背景问题1. 对象转 json 字符串错误问题2. 对象转字节数组错误1 问题解析2 问题处理2.1 使用 ValueFilter 处理2.2 替换有问题的 IntegerCod...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作