C++中的long long和 int64型別(轉載)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
C語言中long long的用法
http://www.awuit.com/c-language-the-usage-of-long-long/
在分析BT程式碼的過程中,遇到了這樣的定義:long long line_position;很是納悶,在C語言中我還沒有見過這樣的寫法,網上搜了,資料也很少,最後在C語言標準與實現這本書中找到了關於long long的說法。在C語言的C99標準擴充套件了新的整數型別 long long,long是32位寬,佔4個位元組,long long通常被定義成 64 位寬,也就可以實現了在32位機器上可以擴充套件8位元組的資料,GUN C也支援,當然在64位平臺上就存在這個問題了。C99標準並沒有硬性規定具體到某種平臺上的某種整數型別究竟佔用多少位元組、能夠表示多大範圍的數值等,只是給出一條原則和一個參考數值集合,只要同時滿足這兩方面條件就算是符合 C 標準。
之後,我查看了C99標準:
—The rank of long long int shall be greater than the rank of long int,which
shall be greater than the rank of int,which shall be greater than the rank of short
int,which shall be greater than the rank of signed char.
意思是說:
long long 的級別高於 long ,long 的級別高於 int ,int 的級別高於 short ,short 的級別高於 char 。(另外有 _Bool 永遠是最低級別)。級別高的整數型別的寬度大於等於級別較低的整數型別。
編譯long long需要支援C99標準的編譯器才行,VC並不支援,但有對應的型別__int64
C++ __int64用法
http://341871.blog.51cto.com/331871/71253
在做ACM題時,經常都會遇到一些比較大的整數。而常用的內建整數型別常常顯得太小了:其中long 和 int 範圍是[-2^31,2^31),即-2147483648~2147483647。而unsigned範圍是[0,2^32),即0~4294967295。也就是說,常規的32位整數只能夠處理40億以下的數。
那遇到比40億要大的數怎麼辦呢?這時就要用到C++的64位擴充套件了。不同的編譯器對64位整數的擴充套件有所不同。基於ACM的需要,下面僅介紹VC6.0與g++編譯器的擴充套件。
VC的64位整數分別叫做__int64與unsigned __int64,其範圍分別是[-2^63, 2^63)與[0,2^64),即-9223372036854775808~9223372036854775807與0~18446744073709551615(約1800億億)。對64位整數的運算與32位整數基本相同,都支援四則運算與位運算等。當進行64位與32位的混合運算時,32位整數會被隱式轉換成64位整數。但是,VC的輸入輸出與__int64的相容就不是很好了,如果你寫下這樣一段程式碼: 1 __int64 a;
2 cin >> a;
3 cout << a;
那麼,在第2行會收到“error C2679: binary '>>' : no operator defined which takes a right-hand operand of type '__int64' (or there is no acceptable conversion)”的錯誤;在第3行會收到“error C2593: 'operator <<' is ambiguous”的錯誤。那是不是就不能進行輸入輸出呢?當然不是,你可以使用C的寫法: scanf("%I64d",&a);
printf("%I64d",a); 就可以正確輸入輸出了。當使用unsigned __int64時,把"I64d"改為"I64u"就可以了。
OJ通常使用g++編譯器。其64位擴充套件方式與VC有所不同,它們分別叫做long long 與 unsigned long long。處理規模與除輸入輸出外的使用方法同上。對於輸入輸出,它的擴充套件比VC好。既可以使用 1 long long a;
2 cin>>a;
3 cout<<a; 也可以使用 scanf("%lld",&a);
printf("%lld",a);
使用無符號數時,將"%lld"改成"%llu"即可。
最後我補充一點:作為一個特例,如果你使用的是Dev-C++的g++編譯器,它使用的是"%I64d"而非"%lld"。
__int64的printf問題!
http://blog.chinaunix.net/u/19782/showart_403061.html
|