जावा में सच लौटने के लिए i का मूल्य (i == -i && i! = 0)


101

मेरी निम्नलिखित ifशर्त है।

if (i == -i && i != 0)

जावा में इस स्थिति के लिए क्या मूल्य iवापस आएगा true?

मैं जावा में दो के पूरक अंकन पर iविचार करने के ऐसे किसी भी मूल्य के बारे में सोचने में असमर्थ हूं ।

मुझे इस स्थिति के बारे में जो भी उत्तर देना है, उसके बीजगणितीय प्रमाण भी पसंद होंगे (जावा के संदर्भ में)?


2
कैसे के बारे में अगर (i = null)
zxc

4
ध्यान दें कि -0.0यह भी है== 0
पीटर लॉरी

2
इसे इस रूप में लिखेंif(i && i == -i)
बृजेश चौहान

10
@GrijeshChauhan जावा में? क्या आपको यकीन है ?
डेनिस सेगुरेट जूल

3
@ हेरोल्ड मैंने पिछले चार वर्षों में कई बार साक्षात्कार में पूछा है और कुछ लोग वास्तव में संकेत के साथ भी इसे प्राप्त करते हैं।
पीटर लॉरी

जवाबों:


126

एकमात्र intमूल्य जिसके लिए यह काम करता है Integer.MIN_VALUE

ऐसा इसलिए है क्योंकि दो के पूरक तरीके का उपयोग करके पूर्णांक को नकार दिया जाता है ।

का उपयोग करते हुए

System.out.println(Integer.toBinaryString(Integer.MIN_VALUE));

आप देखते हैं कि Integer.MIN_VALUEहै

10000000000000000000000000000000

नकारात्मक मूल्य लेना पहले स्वैपिंग द्वारा किया जाता है 0और 1, जो देता है

01111111111111111111111111111111

और जोड़कर 1, जो देता है

10000000000000000000000000000000

जैसा कि आप मेरे द्वारा दिए गए लिंक में देख सकते हैं, विकिपीडिया इस समस्या का सबसे नकारात्मक संख्याओं के साथ उल्लेख करता है और यह एकमात्र अपवाद है:

दो के पूरक में सबसे नकारात्मक संख्या को कभी-कभी "अजीब संख्या" कहा जाता है, क्योंकि यह एकमात्र अपवाद है।

Long.Min_Valueयदि आप इसे एक longचर में संग्रहीत करते हैं, तो निश्चित रूप से आपके पास एक ही घटना है ।

ध्यान दें कि यह केवल उन विकल्पों के कारण है जो जावा में इन्टस के बाइनरी स्टोरेज के संबंध में किए गए थे । उदाहरण के लिए एक और (बुरा) समाधान केवल सबसे महत्वपूर्ण बिट को बदलने और अन्य बिट्स को अपरिवर्तित करने से नकारने के लिए हो सकता है, इससे MIN_VALUE को इस समस्या से बचना होगा लेकिन 2 अलग-अलग 0मान और जटिल द्विआधारी अंकगणित (आपके पास कैसे होंगे) उदाहरण के लिए वेतन वृद्धि?)।


2
यह ध्यान देने योग्य है कि शुरुआती बाइनरी कंप्यूटर ने आपके अंतिम पैराग्राफ में वर्णित पूर्णांक के लिए साइन और परिमाण कार्यान्वयन का उपयोग किया था; IEE754 फ्लोटिंग पॉइंट नंबर के रूप में। en.wikipedia.org/wiki/…
Dan Is Fiddling By Firelight

1
पुन: "यह केवल उन विकल्पों से संबंधित है जो कि किलों के बाइनरी स्टोरेज के बारे में बनाए गए थे": और अतिप्रवाह को कैसे संभालना है इसके विकल्प। नियम जो जावा का उपयोग करता है, वह नियम (सी) या सी (एम) द्वारा उपयोग किए जाने वाले नियम के समान नहीं है, (मानक) एमएल द्वारा इस्तेमाल किया जाता है, भले ही ये सभी सिस्टम की विस्तृत किस्मों पर चलते हैं।
बरबाद

2
वर्थ उल्लेख करते हुए कि इसे जावा स्पेस पर प्रलेखित किया गया है : "जावा प्रोग्रामिंग भाषा पूर्णांक के लिए दो-पूरक प्रतिनिधित्व का उपयोग करती है, और दो-पूरक मूल्यों की सीमा सममित नहीं है, इसलिए अधिकतम नकारात्मक इंट या लंबे परिणाम में नकारात्मक परिणाम ऋणात्मक संख्या।"
चेस्टरबर

25

वह मान जो आप ढूंढ रहे हैं Integer.MIN_VALUE


इस स्थिति का जो भी जवाब हो (मैं जावा के संदर्भ में) का बीजगणितीय प्रमाण देना पसंद करूंगा?

स्टैक एक्सचेंज के लिए यह ऑफ टॉपिक है। लेकिन आप इसे जावा पूर्णांक ( JLS 4.2 ) की परिभाषा से शुरू कर सकते हैं

"अभिन्न प्रकार बाइट, लघु, इंट, और लंबे होते हैं, जिनके मान 8-बिट, 16-बिट, 32-बिट और 64-बिट हस्ताक्षरित दो-पूरक पूर्णांक होते हैं ..."

तथा

"अभिन्न प्रकारों के मूल्य निम्नलिखित श्रेणियों में पूर्णांक हैं ... उदाहरण के लिए, -2147483648 से 2147483647, समावेशी"

और जावा यूनरी की परिभाषा '-' ऑपरेटर ( JLS 15.15.4 ):

"पूर्णांक मानों के लिए, शून्य से घटाव के रूप में नकारात्मकता समान है। जावा प्रोग्रामिंग भाषा पूर्णांक के लिए दो-पूरक प्रतिनिधित्व का उपयोग करती है, और दो-पूरक मूल्यों की सीमा सममित नहीं है, इसलिए अधिकतम नकारात्मक इंट या लंबे परिणामों की उपेक्षा समान अधिकतम नकारात्मक संख्या। इस मामले में ओवरफ्लो होता है, लेकिन कोई अपवाद नहीं फेंका जाता है। सभी पूर्णांक मानों के लिए x, -x बराबर (~ x) +1 है। "


3
साथ ही Long.MIN_VALUE
जुवानिस

1
जो १००००० है .. और अगर मुझे २ की तारीफ मिलती है, तो यह फिर से ०११११११ है ... + १ = १००००० ... लेकिन आप जानते हैं कि यह आपके सिर के ऊपर है या हम कोई तर्क लागू कर सकते हैं?
सनी

1
जैसा कि मैंने पढ़ा है..जवा का इंट अंकगणित अंकगणितीय मॉड 2 पावर 32 है, इसलिए मैं सोच रहा था कि क्या हम इस मूल्य को सिर्फ 1 या 2 लाइनों में साबित कर सकते हैं..इसका एक बड़ा प्रमाण है..इसलिए कोई मुद्दा नहीं।
सनी

2
@ यह साबित करने के लिए बहुत मुश्किल नहीं हो सकता है। पूर्णांक श्रेणी में, सभी सकारात्मक संख्याओं में एक नकारात्मक समकक्ष (इसलिए i != -i) होता है। वह सीमा में दो नंबर छोड़ देता है: 0और Integer.MIN_VALUEi != 0तुम्हारी वजह से अगर, केवल MIN_VALUEबचा है।
विंसेंट वैन डेर वेले जूल

1
@Heuster - वह तर्क काम करता है ... लेकिन यह एक धारणा या दो पर निर्भर करता है जिसे प्रमाण की आवश्यकता होती है।
स्टीफन सी

18

अब तक दिए गए जवाबों के अतिरिक्त ...

कुल चार मूल्य हैं

int i = Integer.MIN_VALUE;
long i = Long.MIN_VALUE;
Integer i = Integer.valueOf(Integer.MIN_VALUE);
Long i = Long.valueOf(Long.MIN_VALUE);

लिपटे हुए मान अलिखित हो जाते हैं इसलिए वे इस अभिव्यक्ति के लिए भी सही हैं।

नोट: Math.abs दस्तावेज़।

सार्वजनिक स्थैतिक int abs (int)

एक इंट वैल्यू का निरपेक्ष मान लौटाता है। यदि तर्क नकारात्मक नहीं है, तो तर्क लौटाया जाता है। यदि तर्क नकारात्मक है, तो तर्क का निषेध लौटा दिया जाता है।

ध्यान दें कि यदि तर्क Integer.MIN_VALUE के मान के बराबर है, तो सबसे नकारात्मक प्रतिनिधित्व योग्य int मान है, परिणाम वही मान है, जो नकारात्मक है।

तथा

सार्वजनिक स्थिर लंबे एब्स (लंबे समय तक)

एक लंबे मूल्य का निरपेक्ष मान लौटाता है। यदि तर्क नकारात्मक नहीं है, तो तर्क लौटाया जाता है। यदि तर्क नकारात्मक है, तो तर्क का निषेध लौटा दिया जाता है।

ध्यान दें कि यदि तर्क Long.MIN_VALUE के मान के बराबर है, तो सबसे नकारात्मक प्रतिनिधित्व करने योग्य लंबा मान है, परिणाम वही मान है, जो नकारात्मक है।

यह आश्चर्यजनक है कि Math.abs एक नकारात्मक संख्या लौटा सकता है। ऐसा या तो इसलिए होता है क्योंकि a) इन मामलों में -MIN_VALUE के लिए कोई सकारात्मक मान नहीं है b) -एक ओवरफ्लो में गणना परिणाम का प्रदर्शन करना ।

ब्याज क्या है क्यों बाइट नहीं करता है। MIN_VALUE, Short.MIN_VALUE ऐसा नहीं करता है। ऐसा इसलिए है क्योंकि इन के लिए -प्रकार बदल जाता है intऔर इस प्रकार कोई अतिप्रवाह नहीं होता है।

Character.MIN_VALUE को कोई समस्या नहीं है क्योंकि यह 0 है।

फ्लोट .IN_VALUE और Double.MIN_VALUE का एक अलग अर्थ है। ये शून्य से अधिक सबसे छोटे प्रतिनिधित्व योग्य मूल्य हैं। इस प्रकार उनके पास वैध नकारात्मक मूल्य हैं जो स्वयं नहीं हैं।


1
मैं Byte.MIN_VALUE और अन्य संभावनाओं के बारे में सोच रहा था, आपके उत्तर ने यह प्रदान किया। धन्यवाद
Cengiz

14

जैसा दूसरों ने उल्लेख किया है, यह केवल द्वारा पूरा किया गया है Integer.MIN_VALUE। प्रमाण के रूप में, मुझे बाइनरी के अलावा स्पष्टीकरण समझने में आसान प्रस्ताव देना चाहिए (हालांकि यह अभी भी उसी में निहित है)।

ध्यान दें कि Integer.MIN_VALUEके बराबर है -2^31या -2147483648और Integer.MAX_VALUEके बराबर है 2^31-1या 2147483647-Integer.MIN_VALUEयह 2^31अब एक इंटेगर के लिए बहुत बड़ा है (क्योंकि यह अतीत है MAX_VALUE) इस प्रकार एक इंटीगर अतिप्रवाह का कारण बनता है, इसे Integer.MIN_VALUEफिर से बनाता है । यह एकमात्र इंटेगर है जो ऐसा करता है क्योंकि MIN_VALUEकेवल एक ही संख्या है जिसका कोई नकारात्मक समकक्ष 0 से अलग नहीं है।


2
@dystroy वास्तव में मैं कुछ स्पष्टीकरण की तलाश कर रहा था, मार्क के लिए, इंट रेंज में +2147483648 जैसी कोई संख्या नहीं है, इसलिए पहला संदेह यह होना चाहिए कि यह संख्या 0. रेंज के अलावा अन्य है- -2 ^ n से 2 ^ n-1। इसलिए -2 ^ n के लिए कोई सकारात्मक समकक्ष नहीं है। यह केवल एक और संभव int मान है।
सनी

1
मैंने बाइनरी में स्पष्ट नहीं किया है क्योंकि यह पहले से ही किसी और द्वारा कवर किया गया था (मूल रूप से इंट 32-बिट मूल्य है यही कारण है कि इसकी सीमाएं हैं)। इसके अलावा, ऋणात्मक का ऋणात्मक सकारात्मक है, इसलिए शर्तें अभी भी लागू हो सकती हैं।
मार्क एम

1
जावा में विचित्र रूप से पर्याप्त है, संख्या 2147483648केवल एक परिस्थिति में स्रोत कोड में दिखाई दे सकती है: यूनिरी माइनस ऑपरेटर के संचालन के रूप में (जेएलएस 3.10.1)।
एरिक जबलो

6

modulo 2^32अंकगणितीय बीजगणितीय प्रमाण, अंकगणितीय का उपयोग कर :

i == -i2 * i == 0( iदोनों पक्षों को जोड़ते हुए), या के रूप में फिर से लिखा जा सकता है i << 1 == 0

इस समीकरण के फार्म के दो समाधान हैं i == 0 >> 1, अर्थात् 0bऔर बाईं ओर या 10000000000000000000000000000000bतो स्थानांतरण करके ।01

समाधान i == 0को बाहर रखा जा रहा है, समाधान है i == 100000000000000000000000000000000b


0

शायद यह बहुत शिक्षाप्रद नहीं है, लेकिन सोचने के बजाय आप इस कोड को चला सकते हैं:

    for (int i = Integer.MIN_VALUE; i <= Integer.MAX_VALUE; i++)
    {
        if (i == -i && i != 0)
        {
            System.out.println(i);
        }
    }

यह देखने के लिए कि यह प्रिंट करता है

-2147483648
-2147483648

असीम रूप से :)


आप कैसे आंकते हैं कि यह असीम है?
12

क्योंकि मैं <= Integer.MAX_VALUE कभी झूठा नहीं होगा
Kuba

1
आह बहुत सच, सोचा कि मैंने सख्ती से देखा<
जेबेलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.