2016-03-25 13 views
12
System.out.println((byte) (1.0/0)); 
    System.out.println((short) (1.0/0)); 
    System.out.println((int) (1.0/0)); 
    System.out.println((long) (1.0/0)); 

परिणाम है:शून्य से पूर्णांक प्राइमेटिव्स का विभाजन क्यों अलग-अलग परिणाम देता है?

-1 
    -1 
    2147483647 
    9223372036854775807 

बाइनरी स्वरूप में:

1111 1111 
    1111 1111 1111 1111 
    0111 1111 1111 1111 1111 1111 1111 1111 
    0111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 

कास्टिंग अनंत int करने के लिए और जब सेट पर हस्ताक्षर बिट करने के लिए "1 लंबे पूर्णांकों, के रूप में" 0 "बिट पर हस्ताक्षर रखता है क्यों "बाइट और लघु पूर्णांक के लिए?

+3

मुझे लगता है कि यह एक 'int' और फिर' बाइट 'पर कास्टिंग कर रहा है नोट: Integer.MAX_VALUE इंफिनिटी के लिए' int 'के निकटतम मूल्य है। –

+0

Thx पीटर, लेकिन 'long' करने के लिए Integer.MAX_VALUE कास्टिंग हमें केवल '2147483647L' देगा, क्या मैं सही हूँ? –

+0

@ पीटर Lawrey '(1.0/0) 'के लिए' डबल 'के रूप में मूल्यांकन किया जाना संभव नहीं होगा, और फिर जाति के लिए जाति नीचे 8 बिट्स पर विचार करें? जबकि आईईईई 754 मानक को 'डबल' और 'फ्लोट' के लिए परिभाषित करता है, मुझे यह अजीब लगता है कि हस्ताक्षर बिट 'int' के लिए 0 है क्योंकि दस्तावेज़ 'int' के लिए अनंत चश्मा परिभाषित नहीं करते हैं। –

उत्तर

10

JLS 5.1.3:

एक अभिन्न प्रकार टी करने के लिए एक फ्लोटिंग प्वाइंट नंबर की एक संकुचन रूपांतरण दो कदम उठा लेता:

पहले चरण में, फ्लोटिंग प्वाइंट नंबर एक लंबे समय तक या तो बदल जाती है , यदि टी लंबा है, या एक int, यदि टी बाइट, शॉर्ट, चार, या int, निम्नानुसार है:

यदि फ़्लोटिंग-पॉइंट नंबर NaN (§4.2.3) है, तो परिणाम कनवर्टर के पहले चरण सायन, 0.

अन्यथा किसी पूर्णांक या लंबी है अगर फ्लोटिंग प्वाइंट नंबर एक अनन्तता नहीं है, फ्लोटिंग प्वाइंट मान एक पूर्णांक मूल्य वी के लिए गोल है, शून्य आईईईई 754 राउंड toward- का उपयोग कर की ओर गोलाई शून्य मोड (§4.2.3)। तब दो मामलों देखते हैं:

तो टी लंबा है, और इस पूर्णांक मान एक लंबे के रूप में प्रतिनिधित्व किया जा सकता है, तो पहला कदम का परिणाम लंबे मूल्य वी

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

अन्यथा, निम्नलिखित दो मामलों में से एक सत्य होना चाहिए:

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

मान बहुत बड़ा होना चाहिए, और पहला कदम का परिणाम (बड़े परिमाण या सकारात्मक अनंत का एक सकारात्मक मूल्य) प्रकार int या लंबे समय के सबसे बड़े प्रदर्शनीय मूल्य है।

दूसरे चरण में:

तो टी पूर्णांक या लंबा है, रूपांतरण के परिणाम पहला कदम का परिणाम है।

तो टी बाइट, चार, या कम है, रूपांतरण के परिणाम टाइप करने के लिए एक संकुचन रूपांतरण के परिणाम टी है (§5.1.3) पहला कदम के परिणाम की।

तो एक अनंत डबल मूल्य, Integer.MAX_VALUE वापस लौट कर int करने के लिए पहले डाली है और तो यह byte/short के लिए आगे डाली है, जो कम बाइट्स की उपयुक्त संख्या लेता है (और हो जाता है -1 एक परिणाम के रूप है)। डाले करने int और long कि अतिरिक्त कदम की जरूरत नहीं है, लेकिन byte और shortbyte/short तो जाना पहलेint और के माध्यम से।

+0

मैं संक्षिप्त रूप से संकीर्ण रूपांतरण को संदर्भित करने वाला था! +1 –

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