2011-06-13 10 views
8

निम्न गणना नकारात्मक मान क्यों उत्पन्न करती है?जावा में गुणात्मक संचालन के परिणामस्वरूप नकारात्मक मान

long interval = 0; 

interval = ((60000 * 60) * 24) * 30; 
+2

गणना को कई चरणों में अलग करें और इसे डीबगर में ट्रैक करें। यह प्रदर्शित करना चाहिए कि यह कहां गलत हो जाता है। –

उत्तर

32

हर अभिव्यक्ति मूल्यांकन किया जा रहा है में; int * int बजाय long * long के रूप में (संकलन समय पर, निश्चित रूप से यह एक निरंतर है)। नतीजा कुछ बिंदु पर बहती है। तो बस सब संकार्य शाब्दिक लंबे बनाने के लिए L का उपयोग करें:

interval = ((60000L * 60L) * 24L) * 30L; 
बेशक

आप दूर केवल ऑपरेंड देशांतर के कुछ बनाने के साथ मिल सकता है, लेकिन मैं इसे आसान है बस सब कुछ बदलने के खोजने के लिए करते हैं।

, यह सब कहा करने के बाद आप "मिलीसेकेंड के 30 दिनों के लायक" इसका इस्तेमाल करने के लिए बेहतर होगा देख रहे हैं:

long interval = TimeUnit.DAYS.toMillis(30); 
2

क्योंकि समीकरण के मूल्य इतने बड़े होते हैं कि यह चारों ओर लपेटता है, इसके परिणामस्वरूप यह एक इंटीजर होगा। Int

3

इस प्रयास करें, यह नकारात्मक नहीं होगा:

long interval = 0; 

interval = ((60000L * 60L) * 24L) * 30L; 
+0

क्यों 'अंतराल = 0; '? –

+0

@प्रशांत भेट - बस ओपी के कोड की प्रतिलिपि बनाई गई :) 'अंतराल = 0; 'बिल्कुल आवश्यक नहीं है। – adarshr

2

आपका मान 2592000000 है जो अधिकतम हस्ताक्षरित पूर्णांक मान 2^31 (2147483648) से बड़ा है। इसे पूर्णांक ओवरफ़्लो कहा जाता है, परिणाम नकारात्मक में बहता है।

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