2009-11-13 12 views
36

क्या कोई सी ++ क्रॉस-प्लेटफ़ॉर्म लाइब्रेरी है जो मुझे पोर्टेबल अधिकतम पूर्णांक संख्या प्रदान करती है?सी ++: अधिकतम पूर्णांक

मैं घोषणा करना चाहते हैं:

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

मैं MSVC 2008 अप्रबंधित का उपयोग करें।

+4

आपको lib की आवश्यकता नहीं है, आपको सी ++ सीखना होगा; आप जो पूछ रहे हैं वह मानक सी ++ (std :: numeric_limits) – KeatsPeeks

उत्तर

91

सी ++ मानक पुस्तकालय हेडर <limits> में, आप पाएँगे:

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

जो तुम उस प्रकार int के एक चर में संग्रहीत किया जा सकता अधिकतम मूल्य बता देंगे। numeric_limits एक क्लास टेम्पलेट है, और आप इसे अधिकतम मूल्य प्राप्त करने के लिए किसी भी संख्यात्मक प्रकार को पारित कर सकते हैं।

numeric_limits कक्षा टेम्पलेट में बहुत सारे other information about numeric types as well हैं।

+1

असल में इसे "फ़ंक्शन टेम्पलेट" कहा जाता है, न कि दूसरी तरफ। लेकिन दूसरी बात यह है कि बहुत अच्छी सलाह है। +1 – sbi

+1

@ एसबीआई: सुधार के लिए धन्यवाद। सी ++ मानक वास्तव में उन्हें "फ़ंक्शन टेम्पलेट्स" (14.8.1) कहते हैं, लेकिन "नॉटम्प्लेट फ़ंक्शन" वाक्यांश का भी उपयोग करता है, जो मुझे लगता है कि वाक्यांश "टेम्पलेट फ़ंक्शन" भी स्वीकार्य हो सकता है; यहां तक ​​कि अत्यधिक प्रतिष्ठित सी ++ संदर्भ (http://www.parashift.com/c++-faq-lite/templates.html#faq-35.13) वाक्यांश "टेम्पलेट फ़ंक्शन" का उपयोग करें। किसी भी मामले में, मैंने अनजाने में सही शब्दावली के साथ उत्तर अद्यतन किया है। :-) –

+1

कमौ के पास एक faq प्रविष्टि है: http://www.comeaucomputing.com/techtalk/templates/#terms –

10

limits.h (सी) या climits (सी ++) देखें। इस मामले में आप INT_MAX निरंतर चाहते हैं।

3

मैं जानता हूँ कि इस सवाल का जवाब दिया गया है, लेकिन मैं तो बस मेरे पुराने दिनों से जानना चाहता हूँ, मैं इसे

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

के रूप में ही देंगे

int max = (unsigned int)-1 

करते थे?

+0

यह चाल केवल हस्ताक्षरित अधिकतम मानों के लिए काम करती है। – AnT

+0

यह सवाल के बारे में एक सवाल था, क्यों -2 !? –

+6

भविष्य के संदर्भ के लिए, StackOverflow 1 प्रश्न के रूप में सबसे अच्छा काम करता है -> कई उत्तर प्रकार की चीज़। यदि आपके पास कोई प्रश्न है (और जो आप लाते हैं वह उचित लगता है), एक नया सवाल पोस्ट करने के लिए स्वतंत्र महसूस करें। यहां, ऐसा लगता है कि आप सलाह देने की कोशिश कर रहे हैं कि दूसरों को गलत के रूप में perseive। –

1

अश्वशक्ति UX पर एसीसी संकलक के साथ:

#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 पूर्णांक == sizeof लंबे

INT_MAX = LONG_MAX

मैं दोनों int और लंबे प्रकार को चेक किया 4bytes हैं। मैनपेज सीमा (5) का कहना है कि INT_MAX और LONG_MAX दोनों 2147483647

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

हैं तो, निष्कर्ष std :: numeric_limits < प्रकार> :: पोर्टेबल नहीं है।

+0

मैं निष्कर्ष निकालूंगा कि कार्यान्वयन में या आपके कार्यक्रम में एक बग है। मुझे आपके प्रोग्राम में कोई समस्या नहीं दिखाई दे रही है, लेकिन अगर आप पिछले दो लाइनों सहित * सटीक * आउटपुट कॉपी और पेस्ट करेंगे तो यह सहायक होगा। –

+0

यह एक बग है http://marc.info/?l=apache-stdcxx-issues&m=120683278410901 – yet

+0

लिंक फ़्लोटिंग-पॉइंट सीमाओं के बारे में चर्चा के लिए इंगित करता है, पूर्णांक सीमा नहीं। क्या आप वाकई प्रासंगिक हैं? –

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 है, जो बहुत मदद नहीं कर रहा है, इसलिए हम बिना हस्ताक्षर किए गए int को डालने के लिए मजबूर कर रहे हैं, बजाय 0 में स्थानांतरित करने के लिए मजबूर कर रहे हैं, अन्य सभी को देते हुए साइन बिट 0 सेट कर रहे हैं बिट्स 1 रहती है।

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

हम यह भी एक मुखौटा और XOR इस्तेमाल कर सकते हैं, लेकिन फिर हम चर का सही bitsize पता करने के लिए किया था। बिट्स फ्रंट में स्थानांतरित होने के साथ, हमें किसी भी समय यह पता नहीं होना चाहिए कि मशीन या कंपाइलर पर कितने बिट्स हैं और न ही हमें अतिरिक्त पुस्तकालयों की आवश्यकता है।

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