2013-04-08 7 views
7
long freeSize = ((Main.maxSPace-Main.usedSpace)*1000*1000); 

maxSpace = 20000 
usedSpace = 8 

->freeSize = -1482836480घटाकर देशांतर गलत हो जाता है

क्यों इस परिणाम नकारात्मक है?

+2

वे अधिकतम स्पेस के मूल्य हैं और इस्तेमाल किए गए एसपीए ce? – Justin

+1

क्या आप अंकगणित के बाद अधिकतम स्पेस और प्रयुक्त स्पेस घोषित करते हैं या आप बस हमें बता रहे हैं कि वे क्या बराबर हैं? आपको अधिक कोड –

+0

पोस्ट करने की आवश्यकता है MaxSpace, usedSpace चर किस प्रकार हैं? –

उत्तर

5

long को int से maxSpace और usedSpace के प्रकार बदलें। आप ऐसा करते हैं तो ऐसा नहीं कर सकते हैं, बस की तरह

long freeSize = 1000L*1000*(Main.maxSPace - Main.usedSpace); 

तो परिणाम long, नहीं int के रूप में गणना की जाएगी कुछ करने के लिए अपने कोड बदल जाते हैं।

अब यह इस

Main.maxSPace-Main.usedSpace    -> 19992 
(Main.maxSPace-Main.usedSpace)*1000  -> 19992000 
(Main.maxSPace-Main.usedSpace)*1000*1000L -> 19992000000 

समस्या यहाँ की तरह गणना की जाती है कि हम पूर्णांकों पर काम कर रहे हैं है, इसलिए परिणाम भी पूर्णांक होना चाहिए, लेकिन पूर्णांक के अधिकतम मूल्य

2147483647 so 
19992000000 is out of range 

तो जावा होगा है परिणाम के केवल अंतिम 32 बिट्स लें और इसे पूर्णांक

10010100111100111011011011000000000 -> 19992000000 
    10100111100111011011011000000000 -> -1482836480 
3

maxSpace और usedSpace इनट्स के रूप में घोषित किए जाते हैं, इसलिए सभी अंकगणित इनट्स के साथ किया जाता है। केवल तभी जब आप परिणाम freeSize पर असाइन करते हैं, तो यह लंबे समय तक डाला जाता है, लेकिन तब से अतिप्रवाह हुआ है।

1000L साथ नंबर 1000 के बजाय ऐसे बलात्कार पहले हो के कारण:

long freeSize = ((Main.maxSPace-Main.usedSpace)*1000L*1000L); 
2

जब maxSpace और usedSpace प्रकार के होते हैं int आप प्रकार अतिप्रवाह की वजह से एक नकारात्मक मूल्य मिलेगा। MaxSpace और usedSpace दोनों चर के लिए लंबे समय तक उपयोग करें।

long freeSize = ((Main.maxSPace-Main.usedSpace)*1000L*1000L); 
3

आप शायद एक ऋणात्मक संख्या हो रही है क्योंकि maxSpace और usedSpace ints हैं: वैकल्पिक रूप से, अगर आप मुख्य की संपत्ति प्रकार नहीं बदल सकते हैं आप अपने कोड को बदल सकते हैं। 20000 - 8 = 19992, 19992 * 1000000 = 19992000000 जो Long.MAX_VALUE से कम है (2 - 1) लेकिन यह Integer.MAX_VALUE (2 - 1) से अधिक है। 19992000000 - Integer.MAX_VALUE = 17844516353 जो अभी भी int के मूल्य के लिए सीमा से बाहर है। आपको maxSpace और usedSpace लंबे समय तक रहने देना चाहिए।

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