java - हरण - पूर्णांक संख्या क्या होती है




पूर्णांक की श्रेणी से परे संख्याओं के लिए पूर्णांक प्रकार कास्ट जावा में कैसे व्यवहार करता है? (2)

अच्छा! आपके द्वारा प्रस्तुत किए गए डिज़ाइन निर्णयों के प्रभावों को देखना अद्भुत है।

2147483648l एक long प्रकार है और एक long परिवर्तित करने का नियम int लिए बहुत बड़ा है, रैप-अराउंड नियम को गंतव्य प्रकार में लागू करना है। (हुड के तहत, स्रोत प्रकार से महत्वपूर्ण बिट्स को केवल त्याग दिया जाता है।)

2147483648f एक float प्रकार है और एक float को बदलने के लिए नियम जो गंतव्य प्रकार के लिए बहुत बड़ा है, गंतव्य प्रकार के लिए सबसे बड़ा संभव है। संदर्भ क्या कास्टिंग के MAX_INT में जावा पूर्णांक-प्रकार की आदिम जातियां "छाया हुआ" हैं?

मानकों के बारे में अच्छी बात यह है कि चुनने के लिए बहुत सारे हैं।

यहाँ मेरा कार्यक्रम है।

public class Foo
{
    public static void main(String[] args)
    {
        System.out.println((int) 2147483648l);
        System.out.println((int) 2147483648f);
    }
}

यहाँ आउटपुट है।

-2147483648
2147483647

2147483648l और 2147483648f प्रकार एक ही पूर्णांक में क्यों नहीं डाले जाते हैं? क्या आप बता सकते हैं कि यहां क्या चल रहा है या जावा में कौन सी अवधारणा है जो मुझे इस तरह के प्रकारों के उत्पादन की भविष्यवाणी करने के लिए समझने की आवश्यकता है?


ये नैरोइंग आदिम रूपांतरण ऑपरेशन के उदाहरण हैं।

आपके पहले उदाहरण में, int लिए long :

एक इंटीग्रल टाइप T पर हस्ताक्षर किए गए पूर्णांक का एक संकीर्ण रूपांतरण केवल सभी लेकिन n निम्नतम ऑर्डर बिट्स को अस्वीकार करता है, जहां n टाइप बी का प्रतिनिधित्व करने के लिए बिट्स की संख्या का उपयोग किया जाता है। संख्यात्मक मान के परिमाण के बारे में जानकारी के संभावित नुकसान के अलावा , यह परिणामी मूल्य के संकेत को इनपुट मूल्य के संकेत से अलग कर सकता है।

तो आपकी (int) 2147483648l की 64 बिट्स long :

00000000 00000000 00000000 00000000 10000000 00000000 00000000 00000000

... और पूरी तरह से शीर्ष 32 बिट्स छोड़ने:

10000000 00000000 00000000 00000000

... और शेष 32 बिट्स को एक int रूप में लेना। चूँकि उनमें से सबसे बाईं ओर अब एक साइन बिट ( long और int को दो के पूरक के रूप में संग्रहीत किया जाता है), और चूंकि यह आपके 2147483648l मूल्य में सेट होने के लिए होता है, आप एक नकारात्मक संख्या के साथ समाप्त होते हैं। चूंकि कोई अन्य बिट सेट नहीं है, दो के पूरक में, इसका मतलब है कि आपके पास सबसे कम नकारात्मक संख्या है int प्रतिनिधित्व कर सकते हैं: -2147483648।

int उदाहरण के लिए float एक अधिक जटिल नियम का पालन करता है। आपके मूल्य के लिए प्रासंगिक भाग हैं:

... यदि फ़्लोटिंग-पॉइंट संख्या एक अनन्तता नहीं है, तो फ़्लोटिंग-पॉइंट मान पूर्णांक मान V पर गोल होता है, IEEE 754 राउंड-की-जीरो मोड (§4.2.3) का उपयोग करके शून्य की ओर घूमता है।

... [अगर] मूल्य [है] बहुत बड़ा है (बड़े परिमाण या सकारात्मक अनंत का एक सकारात्मक मूल्य), [तब] पहले चरण का परिणाम इंट या लंबे समय का सबसे बड़ा प्रतिनिधित्व योग्य मूल्य है।

(लेकिन विवरण के लिए उपरोक्त कल्पना का हिस्सा देखें।)

इसलिए 2147483648f से लेकर 2147483648f दौर, और 2147483648 , int में फिट होने के लिए बहुत बड़े हैं, int ( 2147483647 ) के लिए सबसे बड़ा मूल्य इसके बजाय उपयोग किया जाता है।

तो long से int करने के लिए, यह थोड़ा अजीब है; int लिए float में, यह अधिक गणितीय है।

एक टिप्पणी में आपने पूछा है:

क्या आप जानते हैं कि दोनों (short) 32768 और (short) 32768f -32768 मूल्यांकन क्यों करते हैं? मैं ३२7६ evaluate का मूल्यांकन करने के लिए उत्तरार्द्ध को बुझा रहा था।

बहुत बढ़िया सवाल है, और यह वह जगह है जहाँ मेरे "ऊपर दिए गए विवरण के लिए कल्पना से जुड़ा हुआ भाग" ऊपर आता है। :-) (short) 32768f करता है, वास्तव में, (short)(int)32768f :

उपरोक्त लिंक सेक्शन में, "एक फ़्लोटिंग-पॉइंट संख्या के एक अभिन्न प्रकार टी के एक संकीर्ण रूपांतरण के तहत टी को दो चरण लगते हैं:" यह कहता है

  1. पहले चरण में, फ़्लोटिंग-पॉइंट नंबर को या तो एक long , यदि T long , या एक int में परिवर्तित किया जाता है, यदि T byte , short , char या int ...

और फिर बाद में चरण 2 की दूसरी बुलेट में:

  1. * यदि टी byte , char या short , तो रूपांतरण का परिणाम पहले चरण के परिणाम के प्रकार (of5.1.3) के टाइपिंग के लिए एक संकीर्ण रूपांतरण का परिणाम है।

तो चरण एक में, 32768f 32768 (एक int वैल्यू) बन जाता है, और फिर निश्चित रूप से (short)32768 बिट- (short)32768 करता है जिसे हमने long => int में देखा, जो हमें -32768 का एक short मूल्य देता है।





casting