2012-05-07 19 views
5

पर दो बार कास्टिंग मुझे कुछ परेशान कर रहा है और मुझे वीएम चश्मा पर अधिक जानकारी नहीं मिली। यह थोड़ा अस्पष्ट है और अगर कोई मुझे समझा सकता तो अच्छा होगा।एक दूसरे संख्यात्मक प्रकार

कोड के इन कुछ पंक्तियों .....

double myTest = Double.MAX_VALUE; 

System.out.println("1. float: " + (float)myTest); 
System.out.println("2. int: " + (int)myTest); 
System.out.println("3. short: " + (short)myTest); 
System.out.println("4. byte: " + (byte)myTest); 

..... इस उत्पादन का उत्पादन:

  1. फ्लोट: इन्फिनिटी
  2. पूर्णांक: 2147483647
  3. कम: -1
  4. बाइट: -1

byte, short और int दो पूरक के साथ 8, 16, 32 बिट हैं। float और double 32 और 64 बिट आईईईई 754 (see here) हैं।

मेरी समझ से, double का अधिकतम मान इंगित करता है कि मंटिस (52 बिट्स) के सभी बिट्स 1 पर स्विच किए जाते हैं। इसलिए यह आश्चर्यजनक नहीं है कि बहुत कम या बाइट रिटर्न -1 यानी सभी बिट्स को 1 पर स्विच किया जाता है। ऐसा लगता है कि कास्ट double की 'पूंछ' रखता है ताकि यह 8 बिट byte या 16 बिट short में फिट हो।

मुझे int पर कास्ट आश्चर्य है और कुछ हद तक, float पर कास्ट किया गया है। "2. int: 2147483647" प्राप्त करना कैसे संभव है जो 0x7FFFFFFF है, अधिकतम मूल्य जबकि छोटा और बाइट 3. और 4. -1 है?

float पर कास्ट भी अजीब है। यदि myTest की 'पूंछ' पर 32 बिट्स रखे गए थे, तो क्या इसे NaN उत्पन्न नहीं करना चाहिए?

उत्तर

4

जेएलएस धारा 5.1.3 Narrowing Primitive Conversion में नियमों को बताता है। नियम लक्ष्य प्रकार पर निर्भर करते हैं।

float:

फ्लोट करने के लिए डबल से एक संकुचन आदिम रूपांतरण आईईईई 754 गोलाई नियमों से संचालित किया जाता है (§4.2.4)। यह रूपांतरण परिशुद्धता खो सकता है, लेकिन रेंज भी खो सकता है, जिसके परिणामस्वरूप एक गैर-शून्य डबल से एक फ्लोट शून्य और एक सीमित डबल से एक फ्लोट अनंतता होती है। एक डबल नाइन एक फ्लोट NaN में परिवर्तित हो जाता है और एक डबल इन्फिनिटी को उसी हस्ताक्षरित फ्लोट अनंतता में परिवर्तित कर दिया जाता है। (एक सकारात्मक मूल्य

  • ...
  • मान बहुत बड़ा होना चाहिए:

int और long:

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

byte, char और short:

लक्ष्य प्रकार byte, char या short है, तो रूपांतरण यह दो कदम। सबसे पहले, ऊपर वर्णित अनुसार double को long में परिवर्तित किया गया है। फिर, long अंतिम प्रकार में बदल जाती है इस प्रकार है:

एक अभिन्न प्रकार टी को एक हस्ताक्षरित पूर्णांक की एक संकुचन रूपांतरण केवल लेकिन n न्यूनतम आदेश बिट्स, जहां n करने के लिए इस्तेमाल बिट्स की संख्या है सभी को छोड़ देता है प्रकार टी का प्रतिनिधित्व करें। संख्यात्मक मूल्य की परिमाण के बारे में जानकारी के संभावित नुकसान के अतिरिक्त, यह परिणामी मान का संकेत इनपुट मान के संकेत से भिन्न हो सकता है।

+0

धन्यवाद यह बहुत दिलचस्प है। तो एक बार डबल को एक इंट ("मेरे उदाहरण में सबसे बड़ा प्रतिनिधित्व योग्य मूल्य" के साथ डाला जाता है), इसे एक बाइट या एक अलग दर्शन के साथ छोटा किया जाता है ("सभी को सबसे कम ऑर्डर बिट्स छोड़ देता है")। – Jerome

+0

@ जेरोम: बहुत ज्यादा (सिवाय इसके कि मुझे लगता है कि मध्यवर्ती प्रकार 'लंबा' है, लेकिन परिणाम को प्रभावित नहीं करता है)। – NPE

+0

यह ध्यान देने योग्य है कि यद्यपि 'फ्लोट' के लिए 'डबल' कास्टिंग करने से कुछ अलग-अलग मान अलग-अलग हो सकते हैं, यह इस तथ्य की तुलना में मामूली समस्या है कि 'फ्लोट' को 'डबल' में कास्टिंग करने से चीजें हो सकती हैं जिन्हें इसके बजाय अलग नहीं माना जाना चाहिए * गलत * सॉर्ट किया जा सकता है। उदाहरण के लिए, 'फ्लोट एफ = 16777217 दिया गया; डबल डी = 16777216.0000001; ', जो बड़ा है -' एफ' या 'डी'? 'फ्लोट एफएफ = 1 ई 38 एफ * 10 एफ के बारे में कैसे; डबल डीडी = 1e300; '? 'एफएफ' और' डीडी' के बारे में "अलग-अलग" के रूप में बहुत अच्छा नहीं होगा, लेकिन कह रहा है कि 'ff> dd' सैकड़ों ऑर्डर-ऑफ-आयाम गलत है। – supercat