2013-03-26 7 views
6

मैं इस कोड स्निपेट पर हैरान हूँ:इस गुणा में एक पूर्णांक ओवरफ़्लो क्यों है?

#include <climits> 
#include <iostream> 
int main(void) { 
    using namespace std; 
    cout << "long max " << LONG_MAX << endl; 
    long x = 2 * 1024 * 1024 * 1024; 
    cout << "2 * 1024 * 1024 * 1024 = " << x << endl; 
    return 0; 
} 

मैं उम्मीद कर रहा था के रूप में यह होना चाहिए, बजाय मैं हो रही है। हस्ताक्षरित का उपयोग करने में मदद नहीं लगती है। क्या देता है?

long max 9223372036854775807 
2 * 1024 * 1024 * 1024 = -2147483648 
+0

यदि आप '1024' टाइप करते हैं, तो इस भाषा में पूर्णांक होने पर पहले से ही डेटा प्रकार होता है। यही कारण है कि यदि आप लंबे डेटाटाइप चाहते हैं तो आपको '1024L' निर्दिष्ट करना होगा। – eis

उत्तर

11

कुछ L एस * जोड़ें। long x = 2L * 1024L * 1024L * 1024L;

(तकनीकी तौर पर, जब तक एक के रूप में शाब्दिक प्रकार long की है दूसरों long करने के लिए प्रोत्साहित किया जाएगा)

अतिप्रवाह इसलिए होता है क्योंकि 2, आदि डिफ़ॉल्ट रूप से प्रकार int की है और अतिप्रवाह से पहले होता है काम।

integer literals देखें जो विभिन्न अक्षरों को बताता है।

+1

और हस्ताक्षरित int में अधिकतम '(2^31) - 1' है, इसलिए' 2^31' ओवरफ्लो एक करके। (बस इसे और अधिक पूरा करने के लिए)। – scones

+0

मैंने गलती से सोचा कि उपहास इसका ख्याल रखेगा, स्पष्ट रूप से नहीं। thx – Oliver

+0

@ ओलिवर: ओवरफ़्लो असाइनमेंट से पहले होता है। साथ ही, ध्यान दें कि हस्ताक्षर पूर्णांक ओवरफ़्लो C++ में अपरिभाषित व्यवहार है। –

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