2009-11-13 82 views
36

是否有一個C++跨平臺庫爲我提供了一個可移植的最大整數數?C++:最大整數

我要聲明:

const int MAX_NUM = /* call some library here */; 

我用2008年的非託管MSVC。

+4

你不需要lib,你需要學習C++;你要求的是標準C++(std :: numeric_limits) – KeatsPeeks 2009-11-13 21:30:19

回答

91

在C++標準庫頭<limits>,你會發現:

std::numeric_limits<int>::max() 

它會告訴你,可以存儲在int類型的變量最大值。 numeric_limits是一個類模板,您可以將它傳遞給任何數字類型以獲得它們可以容納的最大值。

numeric_limits類模板有很多other information about numeric types as well

+1

實際上它被稱爲「函數模板」,而不是其他方式。但是,這是非常好的建議。 +1 – sbi 2009-11-13 21:47:44

+1

@sbi:感謝您的糾正。 C++標準確實將它們稱爲「函數模板」(14.8.1),但也使用短語「非模板函數」,這使我認爲短語「模板函數」也可以接受;即使是非常有信譽的C++參考(http://www.parashift.com/c++-faq-lite/templates.html#faq-35.13)也使用短語「模板函數」。無論如何,我已經用毫不含糊的正確術語更新了答案。 :-) – 2009-11-13 21:57:41

+1

科莫有一個常見問題條目:http://www.comeaucomputing.com/techtalk/templates/#terms – 2009-11-13 22:03:56

10

參見limits.h(C)或climits(C++)。在這種情況下,您會希望INT_MAX不變。

3

我知道答案已經給出,但我只是想從我的舊天知道,我以前做的

int max = (unsigned int)-1 

它會給一樣

std::numeric_limits<int>::max() 

+0

這個技巧只適用於無符號的最大值。 – AnT 2009-11-13 22:01:42

+0

這是一個關於這個問題的問題,爲什麼-2!? – 2009-11-13 22:18:16

+6

爲了將來的參考,StackOverflow最適合作爲1個問題 - >許多答案類型的事情。如果您有問題(並且您提出的問題看起來很合理),請隨時發佈一個全新的問題。在這裏,看起來你試圖提供其他人認爲不正確的建議。 – 2009-11-13 22:25:39

1

在HP-UX與ACC編譯:

#include <iostream> 
#include <limits> 
using namespace std; 

int main() { 
    if (sizeof(int)==sizeof(long)){ 
    cout<<"sizeof int == sizeof long"<<endl; 
    } else { 
    cout<<"sizeof int != sizeof long"<<endl; 
    } 

    if (numeric_limits<int>::max()==numeric_limits<long>::max()){ 
    cout<<"INT_MAX == lONG_MAX"<<endl; 
    } else { 
    cout<<"INT_MAX != LONG_MAX"<<endl; 
    } 

    cout << "Maximum value for int: " << numeric_limits<int>::max() << endl; 
    cout << "Maximum value for long: " << numeric_limits<long>::max() << endl; 
    return 0; 
} 

它打印:

的sizeof INT ==的sizeof長

INT_MAX = LONG_MAX

我檢查兩個int和long類型是4字節。 聯機幫助限制(5)表示,INT_MAX和LONG_MAX都2147483647

http://nixdoc.net/man-pages/HP-UX/man5/limits.5.html

所以,結論的std :: numeric_limits <類型> ::是不可移植。

+0

我會得出結論,有一個錯誤,無論是在實施或在您的程序。我沒有看到你的程序有問題,但是如果你複製並粘貼* exact *輸出,包括最後兩行,這將會很有幫助。 – 2014-04-17 16:16:47

+0

這是一個bug http://marc.info/?l=apache-stdcxx-issues&m=120683278410901 – yet 2014-04-17 17:34:23

+0

鏈接指向關於浮點限制的討論,而不是整數限制。你確定它是相關的嗎? – 2014-04-17 17:48:50

6

我知道這是一個老問題,但也許有人可以使用此解決方案:

int size = 0; // Fill all bits with zero (0) 
size = ~size; // Negate all bits, thus all bits are set to one (1) 

到目前爲止,我們已經爲-1的結果「,直到大小是一個符號整數。

size = (unsigned int)size >> 1; // Shift the bits of size one position to the right. 

作爲標準說,即在移位位是1,如果變量被簽署和負和0,如果變量將是無符號或符號且爲正。

由於大小是有符號和負數,所以我們將在符號位中移位1,這沒有多大幫助,所以我們將其轉換爲無符號整型,強制要移入0,而將符號位設置爲0,同時讓所有其他位位保持1。

cout << size << endl; // Prints out size which is now set to maximum positive value. 

我們也可以使用一個掩碼和異或然後我們必須知道變量的確切比特大小。隨着位移向前,我們不必知道int在機器或編譯器上有多少位,也不需要我們包含額外的庫。