最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中的long long與__int64

 更新時間:2021年11月03日 10:44:39   作者:Coder_LT  
這篇文章主要介紹C++中的long long與__int64,在C++ Primer當(dāng)中提到的64位的int只有l(wèi)ong long,但是在實際各種各樣的C++編譯器當(dāng)中,64位的int一直有兩種標(biāo)準(zhǔn).一種是long long,還有一種是__int64,非主流的VC甚至還支持_int64,下面文章將介紹具體內(nèi)容,需要的朋友可以參考一下

1、long long 和 __int64

C++ Primer當(dāng)中提到的64位的int只有long long,但是在實際各種各樣的C++編譯器當(dāng)中,64位的int一直有兩種標(biāo)準(zhǔn)。一種是long long,還有一種是__int64,非主流的VC甚至還支持_int64。

對于一般的C++開發(fā)者來說,其實這個問題不那么要緊,因為在實際開發(fā)當(dāng)中,絕大多數(shù)情況使用32位的int就足夠應(yīng)付了。很少會出現(xiàn)超過int范圍的情況,但是對于算法玩家來說,這是一個必須考量的問題。因為很多題目會故意把范圍弄得很大,考察選手對于數(shù)據(jù)范圍的敏感。

關(guān)于long long__int64,我們有非常多的問題要討論,我們一個一個來說。

2、歷史遺留問題

首先是聊聊這個問題的背景,為什么會有兩種標(biāo)準(zhǔn)呢?這并不是C++的標(biāo)準(zhǔn)不嚴(yán)謹(jǐn),或者是各大編譯器亂來,背后是有一個歷史遺留問題的。

long long最早是C99標(biāo)準(zhǔn)引進(jìn)的,然而VC6.0推出于1998年,在C99標(biāo)準(zhǔn)之前。所以當(dāng)時微軟就自己搞出來一個變量叫做__int64來表示64位整數(shù)。很多同學(xué)使用的第一個C++的編譯器就是VC6.0,所以記得在VC6.0當(dāng)中要使用__int64而非long long。

既然VC6.0搞出了__int64,那么微軟后續(xù)的C++版本顯然就必須要兼容它。所以在win系統(tǒng)當(dāng)中,這個__int64的變量類型就一直沿用了下來。當(dāng)然,由于C++標(biāo)準(zhǔn)的更新,當(dāng)然最新的visual studio已經(jīng)支持long long了。

GCC并不是基于windows系統(tǒng)的,自然支持long long。win平臺下的一些其他IDE如dev C++ ,CodeBlocks等也支持long long,因為它們?yōu)榱撕臀④浀南到y(tǒng)兼容,所以也支持__int64。所以一個比較簡單的區(qū)分方法是,判斷編譯器運行的操作系統(tǒng)是否是windows,如果是windows使用__int64,否則使用long long。

3、cin、cout和scanf、printf的選擇問題

這個問題對于C++開發(fā)工程師來說同樣不是個問題,沒有任何選擇的必要,無腦用cincout就完事了。但對于算法競賽玩家來說,這依然是一個要考慮的問題。

因為在算法競賽當(dāng)中,尤其是當(dāng)數(shù)據(jù)量很大的時候,讀入和輸出占據(jù)的時間是非??捎^的??雌饋碇皇?code>cin cout和scanfprintf的差別,但是兩者的性能差異非常大。

我曾經(jīng)做過實驗,同樣的數(shù)據(jù),使用scanfprintf的效率大約是cin、cout的十倍以上。在小數(shù)據(jù)量的時候當(dāng)然沒有差別,但數(shù)據(jù)量很大的時候影響非常大。很有可能導(dǎo)致同樣的題目,同樣的算法,別人通過了,但是我們卻超時了的情況。

關(guān)于性能差異的原因,主要有兩種解釋。一種解釋是說cin為了與scanf混用,而不用擔(dān)心指針混亂,加上了綁定,總是會與stdin保持同步。正是這一步操作消耗了大量的時間。同理,cout也會有類似的問題。第二種解釋是cout在輸出之前會把要輸出的內(nèi)容先存入緩存區(qū),中間多了一個步驟,也會帶來性能的降低。

關(guān)于cin與stdin同步帶來的開銷,我們是有辦法解決的,只需要在加上這一行代碼:

std::ios::sync_with_stdio(false);


這行代碼的意思是取消cincoutstdin、stdout的指針同步,會使得cincout的性能大大提升,達(dá)到和scanfprintf相差無幾的程度。當(dāng)然,更好的方法是使用scanf、printf代替。

而要使用scanfprintf又有一個問題,它們是C語言的標(biāo)準(zhǔn)輸入輸出方式,需要提供標(biāo)識符來代表變量的類型,那么問題來了long long__int64的標(biāo)識符是什么呢?

這個其實一查就知道了,long long的標(biāo)識符是lld,所以我們使用scanf讀入一個long long類型的數(shù)寫成:

long long a;
scanf("%lld", &a);


__int64的標(biāo)識符是I64d,注意這里是大寫的i,不是l。

__int64 a;
scanf("%I64d", &a);


但是這里面有一個很大的坑點,前面說了,目前在windows平臺的編譯器已經(jīng)兼容了long long類型。但是即便如此,在2013年之前的版本里,我們輸出的時候還是要使用%I64d,這是因為微軟提供的msvcrt.dll庫只支持%I64d的方式。相當(dāng)于從底層上斷絕了使用%lld輸出的可能。2013年微軟修復(fù)了這個問題,添加了對 %lld 的支持。

所以比較簡單的區(qū)分方法就是看操作系統(tǒng),如果是windows系統(tǒng),那么一律使用__int64準(zhǔn)沒錯。如果是linux或者是Mac系統(tǒng),那么統(tǒng)一使用long long

我在網(wǎng)上找到了大神做的總結(jié)表,也可以直接參考下表:

變量定義 輸出方式 gcc(mingw32) g++(mingw32) gcc(linux i386) g++(linux i386) MicrosoftVisual C++ 6.0
long long “%lld” 錯誤 錯誤 正確 正確 無法編譯
long long “%I64d” 正確 正確 錯誤 錯誤 無法編譯
__int64 “l(fā)ld” 錯誤 錯誤 無法編譯 無法編譯 錯誤
__int64 “%I64d” 正確 正確 無法編譯 無法編譯 正確
long long cout 非C++ 正確 非C++ 正確 無法編譯
__int64 cout 非C++ 正確 非C++ 無法編譯 無法編譯
long long printint64() 正確 正確 正確 正確 無法編譯

到此這篇關(guān)于C++中的long long__int64的文章就介紹到這了,更多相關(guān)C++ long long __int64內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

注:文章轉(zhuǎn)自微信眾號:Coder梁(ID:Coder_LT)

相關(guān)文章

  • C++深入講解類與封裝的概念與使用

    C++深入講解類與封裝的概念與使用

    我們都知道C++有三大特性:封裝、繼承、多態(tài),現(xiàn)在我們來總結(jié)一下封裝的相關(guān)知識與類的概念,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-04-04
  • c語言簡單實現(xiàn)文件 r/w 操作方法

    c語言簡單實現(xiàn)文件 r/w 操作方法

    由于在 C 語言中 '\' 一般是轉(zhuǎn)義字符的起始標(biāo)志,故在路徑中需要用兩個 '\' 表示路徑中目錄層次的間隔,也可以使用 '/' 作為路徑中的分隔符,本文重點給大家介紹用c語言簡單實現(xiàn)文件 r/w 操作方法,感興趣的朋友一起學(xué)習(xí)吧
    2021-05-05
  • OpenCV圖像幾何變換之透視變換

    OpenCV圖像幾何變換之透視變換

    這篇文章主要為大家詳細(xì)介紹了OpenCV圖像幾何變換之透視變換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • C++炸彈小游戲示例代碼

    C++炸彈小游戲示例代碼

    這篇文章主要介紹了C++炸彈小游戲,本文給大家分享游戲代碼,代碼簡單易懂通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • 最新評論

    宜君县| 剑阁县| 定远县| 江门市| 克山县| 五台县| 攀枝花市| 茂名市| 汉沽区| 梧州市| 同心县| 洞头县| 长寿区| 沙河市| 常山县| 兴山县| 惠水县| 苗栗市| 霍林郭勒市| 乌鲁木齐市| 嵊泗县| 孟州市| 商水县| 绥宁县| 广州市| 东城区| 右玉县| 阿尔山市| 巴彦县| 杭锦后旗| 兰西县| 太原市| 顺义区| 洛川县| 惠州市| 德化县| 海城市| 马公市| 崇左市| 成武县| 大名县|