long int

  long int即long,给人的感觉好像是长整型,但实际上,它和int一样,只有32位。cppreference给出的定义是——

int - basic integer type. The keyword int may be omitted if any of the modifiers listed below are used. If no length modifiers are present, it’s guaranteed to have a width of at least 16 bits. However, on 32/64 bit systems it is almost exclusively guaranteed to have width of at least 32 bits.
long - target type will have width of at least 32 bits.

  在实际的使用中,long与int几乎没有区别,比如——

#include<stdio.h>int main(){long l = 10000000;int i = 10000000;printf("size of long:%d\n",sizeof(long));printf("size of int:%d\n",sizeof(int));printf("l = %d\n",l);printf("i = %d\n",i);return 0;
}


  既然long int与int相同,那么为什么还有long int这种尴尬的类型呢?
  原因是早期的C编译器定义了long int占用4个字节,int占用2个字节,long int是名副其实的长整型。在ANSI C的标准中,对长整型的定义也是long int应该至少和int一样长,而不是long int 一定要比int占用存储字节长。所以,正确的关系应该是——
long≥int≥shortlong\geq int\geq shortlong≥int≥short
  新版的C/C++标准兼容了早期的这一设定。

long long

  long long则不同,long long是C++的64位整型的基本类型,“现任”长整型,从C99开始引入这个概念,在后续的标准中完善概念和定义,C++11官方正式标准如下——

long long - target type will have width of at least 64 bits.(since C++11)

  long long占用8个字节,数据表示范围也从int的[−231,231−1][-2^{31},2^{31}-1][−231,231−1],升级到[−263,263−1][-2^{63},2^{63}-1][−263,263−1]。

#include<stdio.h>int main(){long l = 10000000;int i = 10000000;long long ll = 100000000000000;printf("size of long:%d\n",sizeof(long));printf("size of int:%d\n",sizeof(int));printf("size of long long:%d\n",sizeof(long long));printf("l = %d\n",l);printf("i = %d\n",i);printf("ll = %lld\n",ll);return 0;
}


  long long是C++的正式标准,这也就意味着,该类型不会因为编译器或者开发平台的不同而有所差异,放之四海而皆准,而且与一些系统函数、类库都有很好的交互(如常见的printf、scanf、cin和cout等)。与之相反,出身MS的__int64就有点不受待见了,在不同的编译器上可能水土不服。

__int64

  在早期的代码中,可能会遇到__int64这种类型,这应该算是“历史遗留”问题。早期的C/C++标准中并没有规定64位长整型的规范,因此不同的编译器对这一模糊概念有不同的定义,我们熟知的VC6.0采用了__int64这种类型来表示64位长整型——

#include<iostream>
#include<cmath>
using namespace std;
int main(){__int64 i64 = -pow(2,63);cout<<"__int64:"<<sizeof(__int64)<<endl; cout<<"i64 = "<<i64<<endl;return 0;
}


  与long long具有相同的效果,但是,__int64并不是正式规范,比如,如果你使用的是MinGW的编译器的话,打开__int64的定义会发现——

  VS 2017虽然把__int64作为了一种内置类型,但是也做了类似的处理,使得__int64与long long没有肉眼可见的差别。但如果你使用的开发环境比较早期,那么可能就要专门研究一下__int64了。比如说,古老的VC6.0并没有long long这种类型,而__int64的输入输出,又需要printf和%I64d的配合,而不是%lld或者直接用cout。

总结

  C/C++与Java等语言不同,具有较高的自由度,由于某些历史原因,某些概念在不同的平台上有不同的解释,虽然现在新版本的C++标准和编译器都在做兼容性工作,你可以在__int64与long long之间无缝切换,但至少,我们要清楚两者的不同。

类型 存储字节 表示范围
int 4 -2147483648~2147483647
short int 2 -32768~+32767
long 4 -2147483648~2147483647(二十亿,约101010^{10}1010)
long long 8 9223372036854775808~+9223372036854775807(九百亿亿,约101910^{19}1019)
__int64 8 9223372036854775808~+9223372036854775807

参考链接

1.https://blog.csdn.net/qq_31736627/article/details/52912691
2.https://en.cppreference.com/w/cpp/language/types
3.https://www.cnblogs.com/ChenDinghao/p/6480937.html
4.https://blog.csdn.net/sk18192449347/article/details/55000087

C/C++:long int与long long的区别相关推荐

  1. .net Int16 、(int Int32)、 Int64 的区别

    2019独角兽企业重金招聘Python工程师标准>>> .net Int16 .(int Int32). Int64 的区别 easonjim 2015-09-25 01:41:00 ...

  2. 两个int()方法的区别

    这两个方法的最大不同是它们对null值的处理方法:  Convert.ToInt32(null)会返回0而不会产生任何异常,但int.Parse(null)则会产生异常. 没搞清楚Convert.To ...

  3. 面试刷题7:int和Integer有什么区别?

    原始数据类型是java系统的重要组成元素.java号称一切都是对象,原始数据类型除外. 我是李福春,我在准备面试,今天我们来回答一个问题: int和Integer有什么区别? int是原始数据类型,并 ...

  4. java的double是什么意思_java中int和double有什么区别

    java中int和double有什么区别 区别如下: 1.int数据类型是32位,double数据类型是64位: 2.int数据类型的默认值是0,double数据类型的默认值是0.0d: 3.整型变量 ...

  5. 【Int、Fix】Int、Fix 函数的区别

    Int.Fix 函数 返回数字的整数部分. Int(number) Fix(number) number 参数可以是任意有效的数值表达式.如果 number 参数包含 Null,则返回 Null. 说 ...

  6. VB中INT和FIX函数的区别

    Int.Fix 函数 返回数字的整数部分. Int(number) Fix(number) number 参数可以是任意有效的数值表达式.如果 number 参数包含 Null,则返回 Null. 说 ...

  7. oracle的int范围,oracle中int类型和number类型区别

    oracle中int类型和number类型区别 INT类型是NUMBER类型的子类型. 下面简要说明: (1)NUMBER(P,S) 该数据类型用于定义数字类型的数据,其中P表示数字的总位数(最大字节 ...

  8. int *p,cons int *p,int const *p,int * const p,const int * const p,int const * const p的区别

     加有const关键字的几种情况的辨析 const修饰的代码 含义(特点) 等价性 int *p = # 1.       可以读自己 2.       可以通过*p改自己 3.       可以 ...

  9. Js String转Int(Number与parseInt的区别)

    <script>      var   str='1250' ;   alert( Number(str) );  //得到1250 alert(parseInt(str));  //得到 ...

  10. 面试官:int和Integer有什么区别?为什么要有包装类?

    作者 | 磊哥 来源 | Java面试真题解析(ID:aimianshi666) 转载请联系授权(微信ID:GG_Stone) 重要说明:本篇为博主<面试题精选-基础篇>系列中的一篇,查看 ...

最新文章

  1. 织梦熊掌号插件兼容php5.3,DedeCMS百度熊掌号推送插件下载
  2. kmp学英语必须设置
  3. Linux TTY/PTS概述
  4. Ajax学习总结(1)——Ajax实例讲解与技术原理
  5. let声明变量时的特点
  6. 拓端tecdat|使用SAS Enterprise Miner进行数据挖掘:信用评分构建评分卡模型
  7. win10最常用dos命令以及win+R即可运行的命令
  8. smartDNS让你的网络一触即达
  9. Spark安装出错问题
  10. 现代控制理论(5)——线性定常系统的综合
  11. Java二叉树的最大深度
  12. 集店管家(App名称)技术服务支持
  13. 平面波超声成像 (Matlab Filed II仿真)
  14. 智慧交通再改革,电子警察抓拍通信传输解决方案
  15. 编译A-LOAM,catkin_make后PCL报错
  16. 怎样把软件从计算机移到桌面上,怎么样才能将旧电脑的重要软件移动到新电脑上?...
  17. Casbin get-users 账号密码泄漏漏洞
  18. TokenGazer《一问到底》第53期:研究员 vs Cocos-BCX
  19. mac如何强制退出程序?强制退出程序的六种方法
  20. C语言基于单链表的词典软件

热门文章

  1. 2018年大连海事大学校赛(ACM竞赛高校联盟训练赛 第11场)题解
  2. etc 文件夹下放什么内容
  3. 小福利,制作词云图的第三种方法---stylecloud库,两行代码制作词云图
  4. 【uniapp小程序】uploadFile文件上传
  5. 泪目了,一位轮椅上的清华博士师兄
  6. pytorch einsum, numpy einsum
  7. android网络权限动态,Android权限详解(含6.0动态申请)
  8. 金山wps c++开发一面总结
  9. 四季电台应用项目源码
  10. ansible meta目录