C/C++之long int与long long的区别及说明

 更新时间:2023年08月07日 09:52:36   作者:大山喵  
这篇文章主要介绍了C/C++之long int与long long的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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占用存储字节长。

所以,正确的关系应该是——

新版的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个字节,数据表示范围也从

#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之间无缝切换,但至少,我们要清楚两者的不同。

类型存储字节表示范围
int4-2147483648~2147483647
short int2-32768~+32767
long4-2147483648~2147483647(二十亿,约 1 0 10 10^{10} 1010)
long long89223372036854775808~+9223372036854775807(九百亿亿,约 1 0 19 10^{19} 1019)
__int6489223372036854775808~+9223372036854775807

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++实现将输入的内容输出到文本文件

    C++实现将输入的内容输出到文本文件

    这篇文章主要介绍了C++实现将输入的内容输出到文本文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C++使用extern实现源文件变量与类成员函数的巧妙共享

    C++使用extern实现源文件变量与类成员函数的巧妙共享

    C++中使用extern关键字可实现在源文件之间共享变量与类成员函数,通过声明变量或类在头文件中,再在一个源文件中定义,其他源文件通过extern引用,促使模块化、可维护的代码组织,这篇文章主要介绍了C++用extern实现源文件变量与类成员函数的巧妙共享,需要的朋友可以参考下
    2024-03-03
  • C语言函数的基本使用和递归小结

    C语言函数的基本使用和递归小结

    这篇文章主要介绍了C语言函数的基本使用和递归小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C++课程设计之图书馆管理系统

    C++课程设计之图书馆管理系统

    这篇文章主要为大家详细介绍了C++课程设计之图书馆管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++中的重载、覆盖、隐藏介绍

    C++中的重载、覆盖、隐藏介绍

    这篇文章主要介绍了C++中的重载、覆盖、隐藏介绍,需要的朋友可以参考下
    2015-04-04
  • C++实现模拟shell命令行(代码解析)

    C++实现模拟shell命令行(代码解析)

    这篇文章主要介绍了C++实现模拟shell命令行,本文通过实例代码进行命令行解析,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • 一文解密C++中的多态机制

    一文解密C++中的多态机制

    众所周知C++语言的三大特性:封装、多态、继承,其中多态就是去完成某个行为,但是会根据不同的对象产生不同的状态,下面小编就来带大家深入了解一下C++的多态机制吧
    2023-07-07
  • C语言实现扫雷小游戏简单版

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

    这篇文章主要为大家详细介绍了C语言实现扫雷小游戏简单版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C语言 const修饰普通变量和指针的操作代码

    C语言 const修饰普通变量和指针的操作代码

    这篇文章主要介绍了C语言const修饰普通变量和指针,用const修饰普通变量时,是在语法层面限制了变量的修改,但是本质上,变量还是变量,是一种不能被修改的变量,本文通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • C++判断一个点是否在圆内的方法

    C++判断一个点是否在圆内的方法

    这篇文章主要为大家详细介绍了C++判断一个点是否在圆内的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05

最新评论