नकारात्मक संख्या के साथ जावा मल्टीपल दो नंबर जारी करना [डुप्लिकेट]
मैं हाल ही में नीचे की समस्या का सामना कर रहा हूं
public class Main {
public static void main(String[] args) throws Exception {
// Your code here!
int i = -2147483648;
int j = i * -1;
System.out.println("j="+j);
}
}
परिणाम: -2147483648
कोड के साथ ऑनलाइन आईडीई: https://paiza.io/projects/e/17lF_6-GltIcyubZv3QoFg?theme=twilight
लेकिन यह तर्क के अनुसार कैसे काम करता है मुझे 2147483648 प्राप्त करने की आवश्यकता है परिणाम सही है? फिर मुझे यह नकारात्मक संख्या कैसे मिली? यह पूर्णांक श्रेणी (Integer.MIN_VALUE) के कारण है? इस समस्या को कैसे ठीक करें?
जवाब
अधिकतम पोस्टिव मूल्य जो int
धारण कर सकता है वह 2147483647
परे होता है, जिसका मान दूसरे छोर पर जाता है (यानी यह नकारात्मक सिरे से शुरू होता है)। आप इसे निम्नलिखित डेमो से समझ सकते हैं:
public class Main {
public static void main(String[] args) {
int i = -2147483648;
int j = i * -1;
System.out.println("j=" + j);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MAX_VALUE + 1);
System.out.println(Integer.MIN_VALUE);
// Some more examples for you to understand this concept better
System.out.println(Integer.MAX_VALUE + 2);
System.out.println(Integer.MAX_VALUE + 3);
}
}
आउटपुट:
j=-2147483648
2147483647
-2147483648
-2147483648
-2147483647
-2147483646
के -2147483648
साथ गुणा होने के बाद -1
, यह बन जाता है 2147483648
लेकिन एक int
चर इस बड़े सकारात्मक मूल्य को पकड़ नहीं सकता है; इसलिए, यह नकारात्मक अंत (यानी Integer.MIN_VALUE
) से शुरू होगा ।
संख्या 2147483648 मौजूद नहीं है। एक इंट का सबसे बड़ा मूल्य 2147483647 है, जो आपके अपेक्षित परिणाम से 1 छोटा है। गुणन एक अतिप्रवाह का कारण बनता है, जो संख्या को सबसे छोटे ऋणात्मक मान पर वापस ले जाता है, और वहां से गणना जारी रखता है। (अन्य शब्दों के साथ: 2147483647 + 1 = -2147483648 (सबसे छोटा ऋणात्मक)) क्योंकि परिणाम केवल अधिकतम मूल्य से 1 अधिक होगा, इसमें कोई अतिरिक्त कार्रवाई की आवश्यकता नहीं है और न्यूनतम इंट वैल्यू लौटा दी गई है।
यदि आप इस समस्या को ठीक करना चाहते हैं, तो अपने चर के लिए 'int' के बजाय 'long' का उपयोग करें। आप BigDecimal जैसे अधिक जटिल वर्गों का भी उपयोग कर सकते हैं, या बाइट सरणियों के लिए एक कस्टम गुणन फ़ंक्शन लिख सकते हैं।
नोट: कोई फर्क नहीं पड़ता कि आप किस संख्यात्मक प्रकार का उपयोग करते हैं, जब तक कि संख्या का प्रतिनिधित्व करने के लिए उपयोग की जाने वाली मेमोरी परिमित है आप इसी तरह के मुद्दों में चला सकते हैं। हालांकि सामान्य परिस्थितियों में यह 32-बिट पूर्णांक (int) के लिए भी संभव नहीं है।