2009-05-06 10 views
7

मैं एक .net कार्यक्रम में एक अजीब व्यवहार साक्षी हूँ:मेरा .NET Int64 का व्यवहार क्यों होता है जैसे कि वे Int32 थे?

Console.WriteLine(Int64.MaxValue.ToString()); 
// displays 9223372036854775807, which is 2^63-1, as expected 

Int64 a = 256*256*256*127; // ok 

Int64 a = 256*256*256*128; // compile time error : 
//"The operation overflows at compile time in checked mode" 
// If i do this at runtime, I get some negative values, so the overflow indeed happens. 

क्यों मेरी Int64 के बर्ताव करता है जैसे कि वे थे Int32 के, हालांकि Int64.MaxValue पुष्टि करने के लिए लगता है कि वे 64 बिट्स का उपयोग कर रहे हैं?

यदि यह प्रासंगिक है, मैं एक 32 बिट ओएस का उपयोग कर रहा है, और इसलिए पूरे आपरेशन Int32 अंकगणित का प्रयोग कर किया जाता है लक्ष्य मंच,

उत्तर

20

आपका आरएचएस केवल Int32 मूल्यों उपयोग कर रहा है "कोई भी सीपीयू" पर सेट है, तो Int32परिणाम को लंबे समय तक प्रचारित किया जाता है।

इस के बदले यह:

Int64 a = 256*256*256*128L; 

और सब कुछ ठीक हो जाएगा।

+1

डैंग आप जॉन स्कीट! तुमने मुझे लगभग 10 सेकंड तक हराया! :) –

+0

मुझे बेवकूफ लगता है :) धन्यवाद! – Brann

+0

आप बेवकूफ नहीं हैं, यह पहले थोड़ा सा अनजान है। तब तक मुझे काटा गया जब मुझे उम्मीद थी कि "डबल रेस = कुछ इंट/अन्य इंट" एक फ्लोटिंग प्वाइंट डिवीजन (जो यह नहीं करता) करता है और सीखा है कि बाएं हाथ की कोई फर्क नहीं पड़ता। –

4

उपयोग:

Int64 a = 256L*256L*256L*128L; 

एल प्रत्यय का मतलब Int64 शाब्दिक, कोई प्रत्यय Int32 का मतलब है।

क्या आपके लिखा है:

Int64 a = 256*256*256*128 

का अर्थ है:

Int64 a = (Int32)256*(Int32)256*(Int32)256*(Int32)128; 
+0

पूंजी प्रत्यय 'एल' की सिफारिश की जाती है क्योंकि इसे अधिक आसानी से पहचाना जाता है, और कुछ फोंट में आप' 1' और 'l' को भी अलग नहीं कर सकते –

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