1. 程式人生 > >C++中的long long和__int64型別

C++中的long long和__int64型別

                      C語言中long long的用法

  C語言的C99標準擴充套件了新的整數型別 long longlong32位寬,佔4個位元組,long long通常被定義成 64 位寬,也就可以實現了在32位機器上可以擴充套件8位元組的資料,GUN C也支援,當然在64位平臺上就存在這個問題了。C99標準並沒有硬性規定具體到某種平臺上的某種整數型別究竟佔用多少位元組、能夠表示多大範圍的數值等,只是給出一條原則和一個參考數值集合,只要同時滿足這兩方面條件就算是符合 標準。
之後,我查看了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用法


  在做ACM題時,經常都會遇到一些比較大的整數。而常用的內建整數型別常常顯得太小了:其中long 和 int 範圍是[-2^31,2^31),即-2147483648~2147483647。而unsigned範圍是[0,2^32),即0~4294967295。也就是說,常規的32位整數只能夠處理40億以下的數。
  那遇到比40億要大的數怎麼辦呢?這時就要用到C++64位擴充套件了。不同的編譯器對64位整數的擴充套件有所不同。基於ACM的需要,下面僅介紹VC6.0g++編譯器的擴充套件。


  VC64位整數分別叫做__int64unsigned __int64,其範圍分別是[-2^63, 2^63)[0,2^64),即-9223372036854775808~92233720368547758070~18446744073709551615(1800億億)。對64位整數的運算與32位整數基本相同,都支援四則運算與位運算等。當進行64位與32位的混合運算時,32位整數會被隱式轉換成64位整數。但是,VC的輸入輸出與__int64的相容就不是很好了,如果你寫下這樣一段程式碼:


那麼,在第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好。既可以使用

cin>>a;
3 cout<<a;

也可以使用

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

  最後我補充一點:作為一個特例,如果你使用的是Dev-C++g++編譯器,它使用的是"%I64d"而非"%lld"

總結:

輸入輸出long long 也可以藉助printf,scanf語句,

但對應的佔位符卻是和平臺相關與編譯器相關的:

Linux中,gcc很統一的用%lld;在windows中,MinGWgccVC6都需要用%I64d

VS2008卻是用%lld