在C99中,我包含了stdint.h,它給了我UINT32_MAX以及uint32_t。但是,在C++中,UINT32_MAX被定義。在包含stdint.h之前,我可以定義__STDC_LIMIT_MACROS,但是如果有人在包含stdint.h之後包含我的頭文件,則這種方法無效。什麼是UINT32_MAX的C++等價物?
所以在C++中,找出uint32_t中可表示的最大值的標準方法是什麼?
在C99中,我包含了stdint.h,它給了我UINT32_MAX以及uint32_t。但是,在C++中,UINT32_MAX被定義。在包含stdint.h之前,我可以定義__STDC_LIMIT_MACROS,但是如果有人在包含stdint.h之後包含我的頭文件,則這種方法無效。什麼是UINT32_MAX的C++等價物?
所以在C++中,找出uint32_t中可表示的最大值的標準方法是什麼?
嗯,我不知道uint32_t
但基本類型(bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, double and long double
)你應該使用numeric_limits
模板通過#include <limits>
。
cout << "Minimum value for int: " << numeric_limits<int>::min() << endl;
cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;
如果uint32_t
是上面比這個代碼應開箱
cout << "Maximum value for uint32_t: " << numeric_limits<uint32_t>::max() << endl;
或者'uint32_t'是否是上述之一的'typedef'? – 2013-06-11 01:56:38
我當然希望它是一個typedef。如果你的工具使用'#define',我質疑它們的質量。 – John 2013-06-11 02:18:02
爲了避免與std :: min()和std :: max()混淆numeric_limits :: min(),numeric_limits :: max(),我必須將它括在括號中,如下所示:(std :: numeric_limits ::最大)(); – 2013-11-07 16:20:47
std::numeric_limits<T>::max()
定義了類型爲T
的最大值。
您可以消除通過改變你的構建過程中的#include
治安問題來定義編譯器命令行而不是在__STDC_LIMIT_MACROS
符號:
cxx -D__STDC_LIMIT_MACROS ...
當然,你仍然有麻煩,如果一個頭#undef
這是這個符號。
此外,您正在使用的標準庫實現的作者可能沒有打算讓用戶設置該特定符號;可能會有一個編譯器標誌或用戶打算用來在C++中啓用C99類型的不同符號。
我不能評論,所以這裏是我對Glen與Lior Kogan的回答的投入。
如果你使用的是靜態變量,你會遇到這樣的問題,如果你在一個類中爲一個常量賦值給numeric_limits :: max(),那麼這個值實際上會因爲初始化的順序而被設置爲零(參見這篇文章zero initialization and static initialization of local scope static variable)
所以在那種情況下,它只會使用Lior Kogan的答案。
// This looks cleaner, less error prone and easier to read than the other suggested by Lior Kogan
#define UINT32_MAX ((uint32_t)-1)
死靈側面說明:'#包括'在C++ –
AJG85
2011-06-09 16:00:50
@ AJG85有正確的答案。 – 2014-08-26 15:31:21