2009-09-18 14 views

उत्तर

22

"विशेष" स्थिरांक और सामान्य लोगों के बीच अंतर दिखाने के लिए एक सरल प्रोग्राम (0 और 100 दोनों का उपयोग करके) सूर्य जावा 6 कंपाइलर एक और बाइटकोड आउटपुट 1 और 2 (मामलों 3 और 4 दोनों के लिए आउटपुट करेगा) जहां तक ​​कंपाइलर का संबंध है 2 के समान)।

उदाहरण के लिए

तो:

double x = 100; 
double y = 100.0; 

संकलित करने के लिए:

0: ldc2_w #2; //double 100.0d 
3: dstore_1 
4: ldc2_w #2; //double 100.0d 
7: dstore_3 

हालांकि, मैं नहीं गारंटी निरंतर अभिव्यक्ति के इस संकलन समय चौड़ा जावा भाषा विशिष्टता में कुछ भी देख सकते हैं। वहाँ संकलन समय तरह के मामलों के लिए संकुचन है:

byte b = 100; 

section 5.2 में विनिर्दिष्ट है, लेकिन वह काफी एक ही बात नहीं है।

हो सकता है कि तेज आँखों से किसी की तुलना में मेरे कहीं एक गारंटी मिल सकता है वहाँ ...

+0

क्या आप एक अच्छा संसाधन सुझा सकते हैं जहां कोई ldc2_w और अन्य निर्देशों के बारे में पढ़ सकता है? –

+2

जेवीएम विनिर्देश: http://java.sun.com/docs/books/jvms/ –

2

अंतिम 3 समान होना चाहिए। दाएं तरफ शाब्दिक पहले से ही एक डबल है। जब आपके पास दशमलव अक्षर होता है तो 'डी' या 'डी' निहित होता है।

पहला 0 उसमें थोड़ा अलग है जो एक शाब्दिक है, जिसे एक डबल तक बढ़ा दिया जाएगा। मुझे नहीं पता कि यह इस मामले में अलग बाइट कोड भी उत्पन्न करता है या नहीं; नतीजा वैसे भी समान होना चाहिए।

+0

उत्तर के लिए धन्यवाद, मुझे पता है कि परिणाम समान हैं, मैं हुड के नीचे मतभेदों को जानना चाहता हूं। –

+0

"0.0", "0.0 डी" और "0.0 डी" के लिए वास्तव में हुड के नीचे कोई अंतर नहीं है। डबल अक्षर लिखने के तीन तरीके हैं, वे सभी बिल्कुल बराबर हैं। – Jesper

-2

जावा के लिए मैं बिल्कुल नहीं जानता, सी में यह वास्तव में खतरनाक हो सकता है यदि आप अंत में इस डी को छोड़ देते हैं क्योंकि यह ऊपरी बाइट्स नहीं बदलेगा, जो आपके परिवर्तनीय झूठ संख्या में प्रभाव डाल सकता है जो वास्तव में नहीं था अंदर रखो!

जावा में मुझे बिगडिसीमल को बढ़ावा देने के साथ वास्तव में बड़ी समस्या थी - नया बिगडिसीमल (0) और नया बड़ा डेसीमल (0 एल) एक ही बात नहीं है, अगर आप जावा कोड से जावा 1.5 में अपना कोड माइग्रेट करते हैं तो आप इसे महसूस कर सकते हैं। पता नहीं क्यों वे इसके बारे में मैला थे, शायद उन्हें ऐसा करना था।

+1

आपका उत्तर प्रश्न का उत्तर नहीं देता है। सी में क्या हो रहा है प्रासंगिक नहीं है और न ही BigDecimals के साथ आपका अनुभव क्या है। –

13

पहले एक के लिए:

double dummy = 0; 

पूर्णांक शाब्दिक 0 एक चौड़ा आदिम रूपांतरण के साथ एक डबल में बदल जाती है , जावा भाषा विशिष्टता में 5.1.2 Widening Primitive Conversion देखें। ध्यान दें कि यह पूरी तरह से कंपाइलर द्वारा किया जाता है, इसका उत्पादन बाइटकोड पर कोई प्रभाव नहीं पड़ता है।

अन्य लोगों के लिए:

double dummy = 0.0; 
double dummy = 0.0d; 
double dummy = 0.0D; 

इन तीन बिल्कुल वैसा ही कर रहे हैं - 0.0, 0.0d और 0.0D सिर्फ तीन एक double शाब्दिक लेखन के विभिन्न तरीके हैं। जेएलएस में 3.10.2 Floating-Point Literals देखें।

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