क्या Integer.MaxValue
जावा में फ़ंक्शन की तरह C / C ++ में पूर्णांक (कंपाइलर के अनुसार) का अधिकतम मान ज्ञात करने के लिए कोई कोड है ?
int
साथ बदलें long long int
...
-pedantic
) इसका समर्थन करते हैं।
क्या Integer.MaxValue
जावा में फ़ंक्शन की तरह C / C ++ में पूर्णांक (कंपाइलर के अनुसार) का अधिकतम मान ज्ञात करने के लिए कोई कोड है ?
int
साथ बदलें long long int
...
-pedantic
) इसका समर्थन करते हैं।
जवाबों:
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;
min
न्यूनतम सकारात्मक मूल्य हैं, जहां पूर्णांक min
न्यूनतम मूल्य हैं। वही सी मैक्रोज़ / स्थिरांक के लिए जाता है।
uint64_t
और int64_t
, की नहीं int
।
#include <limits>
और int imax = std::numeric_limits<int>::max();
, मुझे त्रुटि मिलती है Can't resolve struct member 'max'
। ऐसा क्यों होता है, और इसे कैसे ठीक किया जाए? मैं Ubuntu 14.04 पर CMake और C ++ 11 के साथ CLION IDE का उपयोग कर रहा हूं। मुझे लगता है कि यह इस मुद्दे
मुझे पता है कि यह एक पुराना सवाल है, लेकिन शायद कोई इस समाधान का उपयोग कर सकता है:
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.
हम एक मास्क और एक्सआर का उपयोग भी कर सकते थे लेकिन तब हमें चर के सटीक बिटसाइज़ को जानना था। बिट्स फ्रंट में शिफ्टिंग के साथ, हमें किसी भी समय यह जानने की जरूरत नहीं है कि मशीन या कंपाइलर में कितने बिट्स हैं और न ही हमें अतिरिक्त लाइब्रेरी शामिल हैं।
cout << "INT_MAX:\t" << (int) ((~((unsigned int) 0)) >> 1) << '\n' << "UINT_MAX:\t" << ~((unsigned int) 0) << endl;
#include <climits>
#include <iostream>
using namespace std;
int main() {
cout << INT_MAX << endl;
}
numeric_limits<int>::max()
- टेम्प्लेट संदर्भों में भी काम करता है, लेकिन (मेरे लिए कुछ अथाह कारण के लिए) एक संकलन-समय स्थिरांक के रूप में उपयोग नहीं किया जा सकता है। INT_MAX
- टेम्पलेट कार्यों के भीतर एक मैक्रो, बहुत बेकार है, लेकिन एक संकलन-समय स्थिर के रूप में इस्तेमाल किया जा सकता है।
यहाँ एक मैक्रो है जिसका उपयोग मैं हस्ताक्षरित पूर्णांक के लिए अधिकतम मूल्य प्राप्त करने के लिए करता हूं, जो कि उपयोग किए गए हस्ताक्षरित पूर्णांक प्रकार के आकार से स्वतंत्र है, और जिसके लिए 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);
क्यों नहीं कोड का एक टुकड़ा लिखें:
int max_neg = ~(1 << 31);
int all_ones = -1;
int max_pos = all_ones & max_neg;
ठीक है, मुझे न तो पिछले जवाब पर टिप्पणी करने की आवश्यकता है (फिलिप डी मुइटर की) और न ही यह स्कोर बढ़ा है, इसलिए 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;
इस या उस हेडर का उपयोग करने के विपरीत, यहां हम संकलक से वास्तविक प्रकार का उपयोग करते हैं।
किस बारे में (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))
काम करता है।