2011-10-14 11 views
19

में परिणाम होगा मैं दस्तावेज है कि long = int64 लेकर है की जाँच की और अधिक से अधिक 900.000.000.000.000क्यों इस लंबी पूर्णांक अतिप्रवाह

यहाँ मेरी कोड है:

int r = 99; 
long test1 = r*r*r*r*r; 

रनटाइम पर यह मेरे 919,965,907 बजाय देता है सही की +९५०९९००४९९।

एक और परीक्षण

long test2 = 99*99*99*99*99; 

यह संकलित करने के लिए पूर्णांक अतिप्रवाह कह मना कर दिया।

लेकिन अगर मैं इस

long test3 = 10100200300; 

कर यह ठीक काम करता है।

उत्तर

48

समस्या यह है कि शाब्दिक "99" एक पूर्णांक के रूप में इलाज किया जा रहा है। यदि आप "एल" जोड़ते हैं तो यह लंबे समय तक इसका इलाज करेगा। अपने संकलन समस्या को ठीक करने के लिए:

long test2 = 99L * 99L * 99L * 99L * 99L; 

और "गलत परिणाम" पूर्णांक अतिप्रवाह की वजह से ठीक करने के लिए:

long r = 99; 
long test1 = r * r * r * r * r; 

प्रमुख मुद्दा है कि "=" मूल्यांकन किया जाता है सही करने के लिए अभिव्यक्ति से पहले long r को असाइनमेंट किया गया है।

आप में रुचि हो सकती अन्य शाब्दिक प्रत्यय के होते हैं: क्यों यह 919965907. क्या हो रहा है के लिए बाहर आता है के बारे में अपने प्रश्न के बारे में

Type Suffix Example 
uint U or u 100U 
long L or l 100L 
ulong UL or ul 100UL 
float F or f 123.45F 
decimal M or m 123.45M 

@ m.edmonson, कि मूल्य "रैपिंग" के आसपास है int.MaxValue। आप इसे थोड़ा परीक्षण कार्यक्रम के साथ देख सकते हैं:

int i = 99; // 99 
i *= 99; // 9801 
i *= 99; // 970299 
i *= 99; // 96059601 
i *= 99; // 919965907  should be 9509900499 but comes out to 919965907 
      //      which is (9509900499 % int.MaxValue) 

long k = 9509900499 % int.MaxValue; 

"लपेटने" का क्या अर्थ है? जब आप int.MaxValue से 1 तक पार करते हैं, तो मान "वापस चला जाता है" int.MinValue पर।

int j = int.MaxValue; 
j++; 

bool isNowMinValue = (j == int.MinValue); // true, the value has "wrapped around" 

यह थोड़ा सा सरल है; यदि आप "पूर्णांक ओवरफ़्लो" की खोज करते हैं तो आपको बेहतर स्पष्टीकरण मिलेगा। यह कैसे समझ पूर्णांकों (और अन्य संख्यात्मक प्रकार) 32 बिट के साथ प्रतिनिधित्व कर रहे हैं लायक है:

http://en.wikipedia.org/wiki/Signed_number_representations

+0

उत्कृष्ट उत्तर - क्या आप समझा सकते हैं कि वह क्यों लंबे और पूर्णांक गुणा के बीच एक अलग परिणाम मिलता है? –

+0

क्या आप लपेटकर अपना मतलब समझ सकते हैं? और मॉड्यूलस% के साथ क्या करना है? –

+0

मेरा मानना ​​है कि आपको केवल एक '99 एल' की आवश्यकता है, बाकी का उपहास होगा। –

5

यह पूर्णांक गुणन उपयोग कर रहा है:

long r = 99; 
long test1 = r*r*r*r*r; 
3

आपका दूसरे टेस्ट में विफल रहता है, क्योंकि प्रत्येक 99 एक पूर्णांक है; इसे निम्नलिखित के साथ प्रतिस्थापित करें और यह संकलित करता है।

long test2 = 99L * 99L * 99L * 99L * 99L; 

विवरण के लिए MSDN Long Documentation देखें।

1

कंपाइलर 99 को पूर्णांक के रूप में देख रहा है, भले ही अंतिम परिणाम लंबा रहेगा।

यह काम करेगा।

long test2 = 99L*99L*99L*99L*99L; 
4

अन्य के रूप में कहा है, लेकिन:

long test2 = 99L * 99 * 99 * 99 * 99; 

यह आपको कम L :-) के आसपास

यह इसलिए होता है क्योंकि पहली 99L एक long है साथ सही परिणाम दे देंगे, इसलिए सभी गुणा long "फ़ील्ड" में किए जाते हैं और गुणा से पहले सभी अन्य पूर्णांक long तक बढ़ाए जाते हैं (स्पष्ट रूप से गुणा हमेशा 2 संख्याओं के बीच होता है और यह बाएं से दाएं होता है, तो यह है ((99L * 99) * 99) * 99) * 99 और प्रत्येक "आंशिक" परिणाम एक लंबा है और अगले ऑपरेंड को लंबे समय तक परिवर्तित करने का कारण बनता है।)

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