C/C++之long int與long long的區(qū)別及說明
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幾乎沒有區(qū)別,比如——
#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相同,那么為什么還有l(wèi)ong int這種尷尬的類型呢?
原因是早期的C編譯器定義了long int占用4個字節(jié),int占用2個字節(jié),long int是名副其實的長整型。
在ANSI C的標(biāo)準(zhǔn)中,對長整型的定義也是long int應(yīng)該至少和int一樣長,而不是long int 一定要比int占用存儲字節(jié)長。
所以,正確的關(guān)系應(yīng)該是——
新版的C/C++標(biāo)準(zhǔn)兼容了早期的這一設(shè)定。
long long
long long則不同,long long是C++的64位整型的基本類型,“現(xiàn)任”長整型,從C99開始引入這個概念,在后續(xù)的標(biāo)準(zhǔn)中完善概念和定義,
C++11官方正式標(biāo)準(zhǔn)如下——
long long - target type will have width of at least 64 bits.(since C++11)
long long占用8個字節(jié),數(shù)據(jù)表示范圍也從
#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++的正式標(biāo)準(zhǔn),這也就意味著,該類型不會因為編譯器或者開發(fā)平臺的不同而有所差異,放之四海而皆準(zhǔn),而且與一些系統(tǒng)函數(shù)、類庫都有很好的交互(如常見的printf、scanf、cin和cout等)。
與之相反,出身MS的__int64就有點不受待見了,在不同的編譯器上可能水土不服。
__int64
在早期的代碼中,可能會遇到__int64
這種類型,這應(yīng)該算是“歷史遺留”問題。
早期的C/C++標(biāo)準(zhǔn)中并沒有規(guī)定64位長整型的規(guī)范,因此不同的編譯器對這一模糊概念有不同的定義,我們熟知的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并不是正式規(guī)范,比如,如果你使用的是MinGW的編譯器的話,打開__int64的定義會發(fā)現(xiàn)——
VS 2017雖然把__int64作為了一種內(nèi)置類型,但是也做了類似的處理,使得__int64與long long沒有肉眼可見的差別。
但如果你使用的開發(fā)環(huán)境比較早期,那么可能就要專門研究一下__int64了。
比如說,古老的VC6.0并沒有l(wèi)ong long這種類型,而__int64的輸入輸出,又需要printf和%I64d的配合,而不是%lld或者直接用cout。
總結(jié)
C/C++與Java等語言不同,具有較高的自由度,由于某些歷史原因,某些概念在不同的平臺上有不同的解釋,雖然現(xiàn)在新版本的C++標(biāo)準(zhǔn)和編譯器都在做兼容性工作,你可以在__int64與long long之間無縫切換,但至少,我們要清楚兩者的不同。
類型 | 存儲字節(jié) | 表示范圍 |
---|---|---|
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 |
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
c++中explicit與mutable關(guān)鍵字的深入探究
這篇文章主要給大家介紹了關(guān)于c++中explicit與mutable關(guān)鍵字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05C++中關(guān)于constexpr函數(shù)使用及說明
這篇文章主要介紹了C++中關(guān)于constexpr函數(shù)使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11C語言數(shù)據(jù)結(jié)構(gòu)哈希表詳解
哈希表是一種根據(jù)關(guān)鍵碼去尋找值的數(shù)據(jù)映射結(jié)構(gòu),該結(jié)構(gòu)通過把關(guān)鍵碼映射的位置去尋找存放值的地方,說起來可能感覺有點復(fù)雜,我想我舉個例子你就會明白了,最典型的的例子就是字典2022-02-02C++實現(xiàn)CreatThread函數(shù)主線程與工作線程交互的方法
這篇文章主要介紹了C++實現(xiàn)CreatThread函數(shù)主線程與工作線程交互的方法,是Windows應(yīng)用程序設(shè)計中非常實用的方法,需要的朋友可以參考下2014-10-10