2013-07-08 10 views
5

मुझे अज्ञात प्रकार का अधिकतम पूर्णांक मान कैसे प्राप्त हो सकता है?अज्ञात पूर्णांक प्रकार का अधिकतम मान कैसे खोजें

template<class T> 
T test(T i) { 
    if (((T)-1) > 0) 
     return -1; 
    T max_neg = ~(1 << ((sizeof(T)*8)-1)); 
    T all_ones = -1; 
    T max_pos = all_ones & max_neg; 
    return max_pos; 
} 
+0

नोट: दिया गया कोड शायद गलत था। शुरुआती '-1' परीक्षण और हस्ताक्षरित प्रकारों के लिए वापसी ठीक है, लेकिन फिर:' max_neg' के लिए: पहले 'CHAR_BIT'' 8' से अधिक हो सकता है, और फिर भी आप _sign bit_ में '1' स्थानांतरित कर रहे हैं, जो मुझे लगता है कि अपरिभाषित है; और 'all_ones' के लिए:' -1' _not_ "सभी" हो सकता है, उदाहरण के लिए किसी के पूरक या साइन-और-आयाम मशीन पर। और तर्क के लिए: ऐसा लगता है कि 'max_neg' पहले से ही' max_pos' के बराबर होगा। –

उत्तर

21

std::numeric_limits<T>::max() का उपयोग करें। सी ++ 11 के बाद से, यह फ़ंक्शन constexpr है और इस प्रकार संकलन-समय पर मूल्यांकन किया जाता है।

+2

यहां तक ​​कि प्री-सी ++ 11, फ़ंक्शन आम तौर पर इनलाइन था, और संकलक संकलन-समय पर इसका मूल्यांकन करेगा। (लेकिन क्योंकि इसकी आवश्यकता नहीं थी, आप इसे संदर्भों में उपयोग नहीं कर सकते थे, जिसके लिए एक संकलन समय निरंतर आवश्यक था।) –

5

std::numeric_limits<T>::max() एक अच्छा प्रारंभिक बिंदु है: वहाँ इस तुलना में अधिक कुशल कुछ है।

0

यह अच्छा है: std::numeric_limits<T>::max() या यदि आपको बढ़ावा देना पसंद है: boost::integer_traits<T>::max()

+0

* "दोनों के लिए रैखिक जटिलता" * - हू, क्या अस्तित्व में मौजूद रैखिक जटिलता? यह एक साधारण स्थिर है कि वे वापस आते हैं। –

+1

@ क्रिस्टियन राउ प्री सी ++ 11, मानक ने किसी भी जटिलता को लागू नहीं किया है, इसलिए एक कार्यान्वयन _could_ इसे रैखिक जटिलता बनाता है (बढ़ते हुए बढ़ने से कहें कि वृद्धि के परिणामस्वरूप छोटे मूल्य में)। बेशक, यह कहना सुरक्षित है कि कोई भी बेवकूफ नहीं था। –

+0

@ क्रिस्टियन राउ आप सही हैं। – soerium

संबंधित मुद्दे