int का अधिकतम मूल्य


177

क्या Integer.MaxValueजावा में फ़ंक्शन की तरह C / C ++ में पूर्णांक (कंपाइलर के अनुसार) का अधिकतम मान ज्ञात करने के लिए कोई कोड है ?


1
क्या लंबे लॉन्ग इंट का अधिकतम मूल्य ज्ञात करने का कोई तरीका है ??
d3vdpro

बस ग्रेगरी में जवाब के intसाथ बदलें long long int...
जॉर्ज फ्रिट्ज़शे

1
सिवाय इसके कि लंबे समय तक C ++ का हिस्सा नहीं है


@ नील, सही, इसके C99 - लेकिन VC और GCC (बिना -pedantic) इसका समर्थन करते हैं।
जॉर्ज फ्रिट्ज़शे

जवाबों:


323

C ++ में:

#include <limits>

तो उपयोग करें

int imin = std::numeric_limits<int>::min(); // minimum value
int imax = std::numeric_limits<int>::max();

std::numeric_limits एक टेम्पलेट प्रकार है जिसे अन्य प्रकारों के साथ त्वरित किया जा सकता है:

float fmin = std::numeric_limits<float>::min(); // minimum positive value
float fmax = std::numeric_limits<float>::max();

सी में:

#include <limits.h>

तो उपयोग करें

int imin = INT_MIN; // minimum value
int imax = INT_MAX;

या

#include <float.h>

float fmin = FLT_MIN;  // minimum positive value
double dmin = DBL_MIN; // minimum positive value

float fmax = FLT_MAX;
double dmax = DBL_MAX;

13
ध्यान दें कि फ्लोटिंग-पॉइंट minन्यूनतम सकारात्मक मूल्य हैं, जहां पूर्णांक minन्यूनतम मूल्य हैं। वही सी मैक्रोज़ / स्थिरांक के लिए जाता है।
dalle

4
C99 में आप UINT64_MAX और INT64_MAX का उपयोग भी कर सकते हैं
दिमित्री वायल

3
@DmitryVyal: हां आप कर सकते हैं, लेकिन वे सीमाएँ हैं uint64_tऔर int64_t, की नहीं int
कीथ थॉम्पसन

C ++ में, मैंने ऊपर दिखाए गए समान कोड का उपयोग किया है: #include <limits>और int imax = std::numeric_limits<int>::max();, मुझे त्रुटि मिलती है Can't resolve struct member 'max'। ऐसा क्यों होता है, और इसे कैसे ठीक किया जाए? मैं Ubuntu 14.04 पर CMake और C ++ 11 के साथ CLION IDE का उपयोग कर रहा हूं। मुझे लगता है कि यह इस मुद्दे
modulitos

1
उम्मीद है कि यह किसी की मदद करता है, क्योंकि यह एक CLION IDE बग था जिसे मैंने नवीनतम CLion (निर्माण 138.2344 - CLion प्रारंभिक एक्सेस प्रोग्राम चरण में है, और इस प्रकार अस्थिर है) का उपयोग करके तय किया
modulitos

30

मुझे पता है कि यह एक पुराना सवाल है, लेकिन शायद कोई इस समाधान का उपयोग कर सकता है:

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.

हम एक मास्क और एक्सआर का उपयोग भी कर सकते थे लेकिन तब हमें चर के सटीक बिटसाइज़ को जानना था। बिट्स फ्रंट में शिफ्टिंग के साथ, हमें किसी भी समय यह जानने की जरूरत नहीं है कि मशीन या कंपाइलर में कितने बिट्स हैं और न ही हमें अतिरिक्त लाइब्रेरी शामिल हैं।


1
cout << "INT_MAX:\t" << (int) ((~((unsigned int) 0)) >> 1) << '\n' << "UINT_MAX:\t" << ~((unsigned int) 0) << endl;
स्लैयर

15
#include <climits>
#include <iostream>
using namespace std;

int main() {
  cout << INT_MAX << endl;
}

1
मैं INT_MAX को "C" का समाधान नहीं कहूंगा। यह पुराने स्कूल और C ++ में पदावनत है, हालांकि।
पॉल टॉम्बलिन

6
मुझे लगता है कि दोनों C ++ उत्तर हैं। numeric_limits<int>::max()- टेम्प्लेट संदर्भों में भी काम करता है, लेकिन (मेरे लिए कुछ अथाह कारण के लिए) एक संकलन-समय स्थिरांक के रूप में उपयोग नहीं किया जा सकता है। INT_MAX- टेम्पलेट कार्यों के भीतर एक मैक्रो, बहुत बेकार है, लेकिन एक संकलन-समय स्थिर के रूप में इस्तेमाल किया जा सकता है।
अंकल 14

17
मज़ेदार बात यह है कि संख्यात्मक_आल्ट्स <int> :: msvc पर अधिकतम कार्यान्वयन इस तरह दिखता है: वापसी (INT_MAX);
निकोला स्मिलजनीक डे

13
कृपया जवाब के लिए @ तिराहे का संदर्भ। और अनुमान लगाएं कि num_limits अधिकतम कैसे लागू करता है ()? यह सही है, "वापसी INT_MAX", कम से कम जीसीसी 4.4.0 पर।

2
@UncleBens: इनलाइन फ़ंक्शंस वर्तमान में निरंतर अभिव्यक्तियों के लिए कम नहीं किए जा सकते।
जॉर्ज फ्रिट्ज़ 15

1

यहाँ एक मैक्रो है जिसका उपयोग मैं हस्ताक्षरित पूर्णांक के लिए अधिकतम मूल्य प्राप्त करने के लिए करता हूं, जो कि उपयोग किए गए हस्ताक्षरित पूर्णांक प्रकार के आकार से स्वतंत्र है, और जिसके लिए gcc -Woverflow शिकायत नहीं करेगा

#define SIGNED_MAX(x) (~(-1 << (sizeof(x) * 8 - 1)))

int a = SIGNED_MAX(a);
long b = SIGNED_MAX(b);
char c = SIGNED_MAX(c); /* if char is signed for this target */
short d = SIGNED_MAX(d);
long long e = SIGNED_MAX(e);

1

क्यों नहीं कोड का एक टुकड़ा लिखें:

int  max_neg = ~(1 << 31);
int  all_ones = -1;
int max_pos = all_ones & max_neg;

28
इसमें कोई गारंटी नहीं है कि int 32 बिट्स आकार का है और मेमोरी निगेटिव पूर्णांक प्रारूप में मेमोरी के बारे में कोई गारंटी नहीं है। कम महत्वपूर्ण बात यह है कि लोगों को '~' बनाने की कोई आवश्यकता नहीं है।
सकी डेसी

0

ठीक है, मुझे न तो पिछले जवाब पर टिप्पणी करने की आवश्यकता है (फिलिप डी मुइटर की) और न ही यह स्कोर बढ़ा है, इसलिए SIGNED_MAX के लिए अपने परिभाषित का उपयोग करते हुए एक नया उदाहरण तुच्छ प्रकारों के लिए दिया गया है:

// We can use it to define limits based on actual compiler built-in types also: 
#define INT_MAX   SIGNED_MAX(int)
// based on the above, we can extend it for unsigned types also:
#define UNSIGNED_MAX(x) (  (SIGNED_MAX(x)<<1) | 1 ) // We reuse SIGNED_MAX
#define UINT_MAX  UNSIGNED_MAX(unsigned int) // on ARM: 4294967295
// then we can have:
unsigned int width = UINT_MAX;

इस या उस हेडर का उपयोग करने के विपरीत, यहां हम संकलक से वास्तविक प्रकार का उपयोग करते हैं।


0
#include <iostrema>

int main(){
    int32_t maxSigned = -1U >> 1;
    cout << maxSigned << '\n';
    return 0;
}

यह आर्किटेक्चर पर निर्भर हो सकता है लेकिन यह मेरे सेटअप में कम से कम काम करता है।


-1

इंट के विशिष्ट अधिकतम मूल्य के लिए , मैं आमतौर पर हेक्साडेसिमल नोटेशन लिखता हूं:

int my_max_int = 0x7fffffff;

अनियमित दशमलव मान के बजाय:

int my_max_int = 2147483647;

-1

किस बारे में (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))? यह भी ऐसा ही है 2^(8*sizeof(int)-2) - 1 + 2^(8*sizeof(int)-2)

अगर sizeof(int) = 4 => 2^(8*4-2) - 1 + 2^(8*4-2) = 2^30 - 1 + 20^30 = (2^32)/2 - 1 [max signed int of 4 bytes]

आप उपयोग नहीं कर सकते 2*(1 << (8*sizeof(int)-2)) - 1क्योंकि यह अतिप्रवाह करेगा, लेकिन (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.