नकारात्मक संख्या के साथ जावा मल्टीपल दो नंबर जारी करना [डुप्लिकेट]

Dec 16 2020

मैं हाल ही में नीचे की समस्या का सामना कर रहा हूं

 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) के कारण है? इस समस्या को कैसे ठीक करें?

जवाब

1 LiveandLetLive Dec 16 2020 at 03:10

अधिकतम पोस्टिव मूल्य जो 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) से शुरू होगा ।

1 tibetiroka Dec 16 2020 at 03:09

संख्या 2147483648 मौजूद नहीं है। एक इंट का सबसे बड़ा मूल्य 2147483647 है, जो आपके अपेक्षित परिणाम से 1 छोटा है। गुणन एक अतिप्रवाह का कारण बनता है, जो संख्या को सबसे छोटे ऋणात्मक मान पर वापस ले जाता है, और वहां से गणना जारी रखता है। (अन्य शब्दों के साथ: 2147483647 + 1 = -2147483648 (सबसे छोटा ऋणात्मक)) क्योंकि परिणाम केवल अधिकतम मूल्य से 1 अधिक होगा, इसमें कोई अतिरिक्त कार्रवाई की आवश्यकता नहीं है और न्यूनतम इंट वैल्यू लौटा दी गई है।

यदि आप इस समस्या को ठीक करना चाहते हैं, तो अपने चर के लिए 'int' के बजाय 'long' का उपयोग करें। आप BigDecimal जैसे अधिक जटिल वर्गों का भी उपयोग कर सकते हैं, या बाइट सरणियों के लिए एक कस्टम गुणन फ़ंक्शन लिख सकते हैं।

नोट: कोई फर्क नहीं पड़ता कि आप किस संख्यात्मक प्रकार का उपयोग करते हैं, जब तक कि संख्या का प्रतिनिधित्व करने के लिए उपयोग की जाने वाली मेमोरी परिमित है आप इसी तरह के मुद्दों में चला सकते हैं। हालांकि सामान्य परिस्थितियों में यह 32-बिट पूर्णांक (int) के लिए भी संभव नहीं है।