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

50 篇文章 4 订阅

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几乎没有区别,比如——

<span style="color:#000000"><code class="language-cpp"><span style="color:#ac9739">#<span style="color:#6679cc">include</span><span style="color:#ac9739"><stdio.h></span></span>

<span style="color:#6679cc">int</span> <span style="color:#3d8fd1">main</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">{</span>
	<span style="color:#6679cc">long</span> l <span style="color:#ac9739">=</span> <span style="color:#ac9739">10000000</span><span style="color:#999999">;</span>
	<span style="color:#6679cc">int</span> i <span style="color:#ac9739">=</span> <span style="color:#ac9739">10000000</span><span style="color:#999999">;</span>
	<span style="color:#3d8fd1">printf</span><span style="color:#999999">(</span><span style="color:#ac9739">"size of long:%d\n"</span><span style="color:#999999">,</span><span style="color:#6679cc">sizeof</span><span style="color:#999999">(</span><span style="color:#6679cc">long</span><span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
	<span style="color:#3d8fd1">printf</span><span style="color:#999999">(</span><span style="color:#ac9739">"size of int:%d\n"</span><span style="color:#999999">,</span><span style="color:#6679cc">sizeof</span><span style="color:#999999">(</span><span style="color:#6679cc">int</span><span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
 	<span style="color:#3d8fd1">printf</span><span style="color:#999999">(</span><span style="color:#ac9739">"l = %d\n"</span><span style="color:#999999">,</span>l<span style="color:#999999">)</span><span style="color:#999999">;</span>
 	<span style="color:#3d8fd1">printf</span><span style="color:#999999">(</span><span style="color:#ac9739">"i = %d\n"</span><span style="color:#999999">,</span>i<span style="color:#999999">)</span><span style="color:#999999">;</span>
	<span style="color:#6679cc">return</span> <span style="color:#ac9739">0</span><span style="color:#999999">;</span>
<span style="color:#999999">}</span>
</code></span>

在这里插入图片描述
  既然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 shortlongintshort
  新版的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,231−1],升级到[ − 2 63 , 2 63 − 1 ] [-2^{63},2^{63}-1][−263,263−1]。

<span style="color:#000000"><code class="language-cpp"><span style="color:#ac9739">#<span style="color:#6679cc">include</span><span style="color:#ac9739"><stdio.h></span></span>

<span style="color:#6679cc">int</span> <span style="color:#3d8fd1">main</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">{</span>
	<span style="color:#6679cc">long</span> l <span style="color:#ac9739">=</span> <span style="color:#ac9739">10000000</span><span style="color:#999999">;</span>
	<span style="color:#6679cc">int</span> i <span style="color:#ac9739">=</span> <span style="color:#ac9739">10000000</span><span style="color:#999999">;</span>
	<span style="color:#6679cc">long</span> <span style="color:#6679cc">long</span> ll <span style="color:#ac9739">=</span> <span style="color:#ac9739">100000000000000</span><span style="color:#999999">;</span>
	<span style="color:#3d8fd1">printf</span><span style="color:#999999">(</span><span style="color:#ac9739">"size of long:%d\n"</span><span style="color:#999999">,</span><span style="color:#6679cc">sizeof</span><span style="color:#999999">(</span><span style="color:#6679cc">long</span><span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
	<span style="color:#3d8fd1">printf</span><span style="color:#999999">(</span><span style="color:#ac9739">"size of int:%d\n"</span><span style="color:#999999">,</span><span style="color:#6679cc">sizeof</span><span style="color:#999999">(</span><span style="color:#6679cc">int</span><span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
	<span style="color:#3d8fd1">printf</span><span style="color:#999999">(</span><span style="color:#ac9739">"size of long long:%d\n"</span><span style="color:#999999">,</span><span style="color:#6679cc">sizeof</span><span style="color:#999999">(</span><span style="color:#6679cc">long</span> <span style="color:#6679cc">long</span><span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
 	<span style="color:#3d8fd1">printf</span><span style="color:#999999">(</span><span style="color:#ac9739">"l = %d\n"</span><span style="color:#999999">,</span>l<span style="color:#999999">)</span><span style="color:#999999">;</span>
 	<span style="color:#3d8fd1">printf</span><span style="color:#999999">(</span><span style="color:#ac9739">"i = %d\n"</span><span style="color:#999999">,</span>i<span style="color:#999999">)</span><span style="color:#999999">;</span>
 	<span style="color:#3d8fd1">printf</span><span style="color:#999999">(</span><span style="color:#ac9739">"ll = %lld\n"</span><span style="color:#999999">,</span>ll<span style="color:#999999">)</span><span style="color:#999999">;</span>
	<span style="color:#6679cc">return</span> <span style="color:#ac9739">0</span><span style="color:#999999">;</span>
<span style="color:#999999">}</span>
</code></span>

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

__int64

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

<span style="color:#000000"><code class="language-cpp"><span style="color:#ac9739">#<span style="color:#6679cc">include</span><span style="color:#ac9739"><iostream></span></span>
<span style="color:#ac9739">#<span style="color:#6679cc">include</span><span style="color:#ac9739"><cmath></span></span>
<span style="color:#6679cc">using</span> <span style="color:#6679cc">namespace</span> std<span style="color:#999999">;</span>
<span style="color:#6679cc">int</span> <span style="color:#3d8fd1">main</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">{</span>
	__int64 i64 <span style="color:#ac9739">=</span> <span style="color:#ac9739">-</span><span style="color:#3d8fd1">pow</span><span style="color:#999999">(</span><span style="color:#ac9739">2</span><span style="color:#999999">,</span><span style="color:#ac9739">63</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
	cout<span style="color:#ac9739"><<</span><span style="color:#ac9739">"__int64:"</span><span style="color:#ac9739"><<</span><span style="color:#6679cc">sizeof</span><span style="color:#999999">(</span>__int64<span style="color:#999999">)</span><span style="color:#ac9739"><<</span>endl<span style="color:#999999">;</span> 
	cout<span style="color:#ac9739"><<</span><span style="color:#ac9739">"i64 = "</span><span style="color:#ac9739"><<</span>i64<span style="color:#ac9739"><<</span>endl<span style="color:#999999">;</span>
	<span style="color:#6679cc">return</span> <span style="color:#ac9739">0</span><span style="color:#999999">;</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述
  与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

参考链接

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://blog.csdn.net/CV_Jason/article/details/85244813

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值