C 的64位整數

2022-04-23 05:29:23 字數 1200 閱讀 6998

在做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++編譯器的擴充套件。

vcvc6.0的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;

2cin >> a;

3cout <

那麼,在第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 <

scanf("%i64d",&a);

printf("%i64d",a);

就可以正確輸入輸出了。當使用unsigned __int64時,把"i64d"改為"i64u"就可以了。

oj通常使用g++編譯器。其64位擴充套件方式與vc有所不同,它們分別叫做long long 與 unsigned long long。處理規模與除輸入輸出外的使用方法同上。對於輸入輸出,它的擴充套件比vc好。既可以使用

1long long a;

2cin>>a;

3cout也可以使用

scanf("%lld",&a);

printf("%lld",a);

使用無符號數時,將"%lld"改成"%llu"即可。

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

原文:

C 中的64位整數

在做acm題時,經常都會遇到一些比較大的整數。而常用的內建整數型別常常顯得太小了 其中long 和 int 範圍是 2 31,2 31 即 2147483648 2147483647。而unsigned範圍是 0,2 32 即0 4294967295。也就是說,常規的32位整數只能夠處理40億以下的...

c 中的64位整數

主流編譯器不支援64位整數。c99將long long納入標準中。long long型別的位數不低於64.linux上gcc從4.5版本開始,完全支援c99標準,因此可以使用long long表示64位整數。windows vc6.0 不支援c99標準,但是windows為了支援64位整型,可以使用...

64位整數乘法

64位整數乘法 求 a 乘 b 對 p 取模的值。輸入格式 第一行輸入整數a,第二行輸入整數b,第三行輸入整數p。輸出格式 輸出乙個整數,表示a b mod p的值。資料範圍 1 a,b,p 1018 看到這個資料範圍有點茫然 跑去查了下unsigned long long 最近做題的時候,經常遇到...