中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用C++中的long long與__int64

發布時間:2021-11-03 15:10:38 來源:億速云 閱讀:613 作者:iii 欄目:開發技術

本篇內容介紹了“怎么使用C++中的long long與__int64”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1、long long 和 __int64

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

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

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

2、歷史遺留問題

首先是聊聊這個問題的背景,為什么會有兩種標準呢?這并不是C++的標準不嚴謹,或者是各大編譯器亂來,背后是有一個歷史遺留問題的。

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

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

GCC并不是基于windows系統的,自然支持long long。win平臺下的一些其他IDE如dev C++ CodeBlocks等也支持long long,因為它們為了和微軟的系統兼容,所以也支持__int64。所以一個比較簡單的區分方法是,判斷編譯器運行的操作系統是否是windows,如果是windows使用__int64,否則使用long long

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

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

因為在算法競賽當中,尤其是當數據量很大的時候,讀入和輸出占據的時間是非常可觀的。看起來只是cin coutscanfprintf的差別,但是兩者的性能差異非常大。

我曾經做過實驗,同樣的數據,使用scanfprintf的效率大約是cincout的十倍以上。在小數據量的時候當然沒有差別,但數據量很大的時候影響非常大。很有可能導致同樣的題目,同樣的算法,別人通過了,但是我們卻超時了的情況。

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

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

std::ios::sync_with_stdio(false);

這行代碼的意思是取消cincoutstdinstdout的指針同步,會使得cincout的性能大大提升,達到和scanfprintf相差無幾的程度。當然,更好的方法是使用scanfprintf代替。

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

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

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

__int64的標識符是I64d,注意這里是大寫的i,不是l。

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

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

所以比較簡單的區分方法就是看操作系統,如果是windows系統,那么一律使用__int64準沒錯。如果是linux或者是Mac系統,那么統一使用long long

我在網上找到了大神做的總結表,也可以直接參考下表:

變量定義輸出方式gcc(mingw32)g++(mingw32)gcc(linux i386)g++(linux i386)MicrosoftVisual C++ 6.0
long long“%lld”錯誤錯誤正確正確無法編譯
long long“%I64d”正確正確錯誤錯誤無法編譯
__int64“lld”錯誤錯誤無法編譯無法編譯錯誤
__int64“%I64d”正確正確無法編譯無法編譯正確
long longcout非C++正確非C++正確無法編譯
__int64cout非C++正確非C++無法編譯無法編譯
long longprintint64()正確正確正確正確無法編譯

“怎么使用C++中的long long與__int64”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大足县| 江油市| 嘉善县| 金塔县| 昌邑市| 北安市| 闻喜县| 开封县| 湛江市| 公安县| 青田县| 化德县| 铜川市| 施甸县| 宁国市| 广水市| 玉龙| 惠水县| 宜兰县| 中方县| 临泽县| 荥经县| 前郭尔| 万载县| 栾城县| 察哈| 渭源县| 高邮市| 涿州市| 浑源县| 双鸭山市| 青岛市| 奈曼旗| 五寨县| 都安| 福贡县| 邮箱| 闸北区| 惠来县| 甘谷县| 电白县|