C/C++:long int与long long的区别

C/C++:long int与long long的区别longint  longint即long,给人的感觉好像是长整型,但实际上,它和int一样,只有32位。cppreference给出的定义是——int-basicintegertype.Thekeywordintmaybeomittedifanyofthemodifierslistedbelowareused.Ifnolengthmodif…

大家好,又见面了,我是你们的朋友全栈君。

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占用存储字节长。所以,正确的关系应该是——
l o n g ≥ i n t ≥ s h o r t long\geq int\geq short longintshort
  新版的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的 [ − 2 31 , 2 31 − 1 ] [-2^{31},2^{31}-1] [231,2311],升级到 [ − 2 63 , 2 63 − 1 ] [-2^{63},2^{63}-1] [263,2631]

#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的定义会发现——
C/C++:long int与long long的区别
  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(二十亿,约 1 0 10 10^{10} 1010
long long 8 9223372036854775808~+9223372036854775807(九百亿亿,约 1 0 19 10^{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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134925.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 在职场,辞退你、培养你,从来不是看能力

    在职场,辞退你、培养你,从来不是看能力

    2022年2月13日
    38
  • HTML img图片加载失败时用默认图片替换

    HTML img图片加载失败时用默认图片替换原文地址:http://blog.csdn.net/qq_24771775/article/details/50294931 img元素加载图片失败,则变成一个小图标,让页面变得难看。此时如何替换为默认图片?onerror属性img元素自带onerror属性,加载失败时,触发error事件src=”http://yongqing.is-programmer.com/posts/i

    2022年6月1日
    36
  • Ubuntu 12.04 下安装RabbitVCS

    Ubuntu 12.04 下安装RabbitVCSWindows下常用的SVN管理工具是TortoiseSVN,而它不支持Linux。如果你想在linux下也使用同样的图形化界面来管理SVN,那么RabbitVCS是一个不错的选择。它支持和TortoiseSVN同样的操作。Ubuntu 12.04下安装方法如下:官方的wiki上指出了安装方法:http://wiki.rabbitvcs.org/wiki/install/ubuntu…

    2022年7月18日
    16
  • java验证码图片工具类_工具类:VerifyCode.java:图片验证码

    java验证码图片工具类_工具类:VerifyCode.java:图片验证码工具类:VerifyCode.java:图片验证码工具类:VerifyCode.java:图片验证码[JavaWeb工具类目录](http://baike.xsoftlab.net/view/1059.html)[http://baike.xsoftlab.net/view/1059.html](http://baike.xsoftlab.net/view/1059.html)源码:“`pac…

    2022年7月15日
    14
  • 怎么防止sql注入攻击_网络安全的威胁

    怎么防止sql注入攻击_网络安全的威胁SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。个人理解:用户通过浏览器访问网站,基本上很多的网站的数据都是保留在数据库中的,客户通过输入特定的数据特征利用网站开发者设计好的SQL查询语句进行对数据库中的数据进行查询,从而返回用户需要的数据,通过浏览器显示呈现到用户,达成整个的交付过程。而SQL攻击就是在用户输入数…

    2025年7月21日
    1
  • 程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址

    程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址第一幕:缘起听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员……996程序员做的梦:第一场:团队招募为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。话说还是中国电信的信号好,地府都是满格,哈哈!!!经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下?而这次,面对这样的需求,这个程序员…

    2022年6月8日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号