1. 程式人生 > >C/C++:long int與long long的區別

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佔用儲存位元組長。所以,正確的關係應該是——
l o n g i
n t s h o r t long\geq int\geq 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的 [ 2 31 , 2 31 1 ] [-2^{31},2^{31}-1] ,升級到 [ 2 63 , 2 63 1 ] [-2^{63},2^{63}-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(二十億,約 1 0 10 10^{10}
long long 8 9223372036854775808~+9223372036854775807(九百億億,約 1 0 19 10^{19} )
__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