2011-10-21 41 views

回答

3

您可以使用unsigned long long,但我會檢查您的編譯器是否支持該類型。

#include <iostream> 
int main() 
{ 
    std::cout<<sizeof(unsigned long long)<< " bytes" << std::endl; 
    return 0; 
} 

在我的機器上打印8 bytes這是足夠的空間來存儲2^63。

1

在大多數現代處理器上,有long long int。從技術上講,這對於C99/C++ 11是新的,但大多數C++編譯器自1999年以來一直支持它。
常量是表格0LL

+1

我認爲後綴是不區分大小寫的。 – cdleonard

+0

從來不知道。也改變了常數。積分也得到較小的數字。在win64上長 –

2

這取決於架構。對於保證的整數寬度,C++沒有C的stdint.h頭。在64位Linux上long將是64位。

我認爲C++ 11增加cstdint作爲stdint.h的包裝。那麼你可以使用int64_t

編輯:正如johannes所指出的,long在Windows中是32位。我不確定這可以在C++ 03中輕鬆完成,同時仍然保持完全符合標準。 long longint64_t不是C++ 03標準的一部分,但通過通用編譯器作爲編譯器擴展提供。

+2

是32位。在Unix/Linux上它是64位的。編寫便攜式代碼時的一個煩惱之一。正如其他人長期提到的那樣,如果得到支持的話,還是要走的。 (C++ 11中的新增功能) – johannes

+0

您的意思是'long long'。在Windows中,'long'在Windows中是32位。 –

+0

更正。我應該停止對Windows的假設,因爲它似乎總是違揹我的期望。 –

1

可以使用GNU multiple precision arithmetic library

它有一個C++ Class Interface以及

注:

C++在GMP支持可以啓用--enable-cxx', in which case a C++ compiler will be required. As a convenience --enable-CXX =檢測' 只有在可以找到編譯器的情況下才能用於啓用C++支持。 C++支持由庫libgmpxx.la和頭文件gmpxx.h 組成(請參閱頭和庫)。

0

__int64long long經常使用,但不是STL的一部分。 long long for C將與GCC一起工作,如果__int64不支持。 在C99中,如果您需要正好 64位可以使用int64_t,從<stdint.h>

0

查看編譯器中limits.h中定義的*_MAX常量。如果它們中的任何一個> = 2^63,請使用與該常數對應的類型。對於我的編譯器,ULLONG_MAX0xffffffffffffffffi6418446744073709551615,這是> = 9223372036854775808(2^63)。所以我會使用unsigned long long作爲類型來保存自然數達到2^63。

0

我不知道這是否有用,但double可以完全代表pow(2,63)的值(沒有錯誤)。然而,它不能完全代表pow(2,63)+ 1.0,也不能代表pow(2,63) - 1.0,所以這可能不是一個有用的答案。因此,如果實際上需要它的整數表示形式,則需要使用無符號的64位整數類型(帶符號的類型不夠,因爲(< < 63)是負值)。不幸的是,64位整數支持很普遍,但並不完全標準化。我相信「unsigned long long int」適用於所有當前版本的編譯器,但是你的里程可能會有所不同。我通過使用typedef爲「uint64」的配置頭來處理差異,然後根據當前編譯器對其進行不同的typedefs。一旦C++ 11得到更廣泛的實施,它將添加「unsigned int64_t」,這將是在此之後做到這一點的正確方法。

相關問題