2010-03-31 17 views
11

में कास्टिंग/रूपांतरण int/double की व्याख्या मैंने कुछ गणना सामग्री को कोड किया (मैंने जो किया है उसके बारे में वास्तव में सरल उदाहरण के नीचे कॉपी किया) CASE2 की तरह और खराब परिणाम प्राप्त हुए। CASE1 जैसे कोड को दोबारा दोहराया और ठीक काम किया। मुझे पता है कि सीएएसई 2 में एक निहित कलाकार है, लेकिन पूर्ण कारण के बारे में सुनिश्चित नहीं है। कोई भी मुझे समझा सकता है कि नीचे क्या हो रहा है?सी #

//CASE 1, result 5.5 
    double auxMedia = (5 + 6); 
    auxMedia = auxMedia/2; 

    //CASE 2, result 5.0 
    double auxMedia1 = (5 + 6)/2; 

    //CASE 3, result 5.5 
    double auxMedia3 = (5.0 + 6.0)/2.0; 

    //CASE 4, result 5.5 
    double auxMedia4 = (5 + 6)/2.0; 

मेरा अनुमान है कि/2 CASE2 में (5 + 6) कास्टिंग है int करने के लिए और 5 के लिए विभाजन के दौर के कारण, तो casted फिर से दोगुना करने के लिए और 5.0 में बदल जाती है।

सीएएसई 3 और सीएएसई 4 भी समस्या को हल करता है।

+2

एक साइड नोट के रूप में; यहां रनटाइम पर केवल * एक * ऑपरेशन किया गया है। मामले में '/ 2' 1. शेष सभी संकलक द्वारा किया जाता है। –

+0

@Marc: क्या संकलक भी संकलन-समय पर पूरी तरह से केस 1 निष्पादित नहीं कर सकता है, क्योंकि 'auxMedia' स्थानीय है और स्थिर के साथ असाइन किया गया है? या यह एक अनुकूलन है जो सख्त रूप से जेआईटी को छोड़ दिया गया है? –

+0

@ माइकल - मैं * उम्मीद करता हूं * कि जेआईटी को छोड़ दिया जाए। इसका उत्तर देने के लिए आपको विभिन्न कंपाइलर आउटपुट देखने की आवश्यकता होगी ... –

उत्तर

13
  1. 5 + 6 पूर्णांक 11 है; जिसे आप फिर डबल (असाइनमेंट में) डालें और दो से विभाजित करें; 5.5
  2. 5 + 6 पूर्णांक 11 है; पूर्णांक 11/2 = पूर्णांक गणित के तहत है, जो आप तो डाली (काम में)
  3. 5,0 + 6,0 दोगुना करने के लिए डबल 11.0 है; डबल 2.0 द्वारा विभाजित डबल 5.5
  4. 5 + 6 पूर्णांक 11 है; एक अंतर्निहित विभाजन के लिए 11.0 दोगुना करने के लिए डाली है, तो विभाजित डबल 2.0 डबल 5,5
+0

मार्क सही है। यदि आपकी दूसरी पंक्ति 'auxMedia = auxMedia/2.0' थी तो आपको परिणाम मिलेगा क्योंकि' 2.0' को डबल के रूप में पढ़ा जाता है और '2' को int के रूप में पढ़ा जाता है (यह किसी भी दशमलव अंक को छोड़ देता है - नहीं यहां तक ​​कि दौर)। – Jaxidian

1
//CASE 2, result 5.0 
double auxMedia1 = (5 + 6)/2; 

(5 + 6) आपरेशन के परिणाम दे रही है पूर्णांक है। क्योंकि दोनों ऑपरेटरों प्रकार पूर्णांक हैं। फिर, कंपाइलर 11/2 करता है, जहां दोनों ऑपरेंड भी पूर्णांक होते हैं। अंतिम विभाजन का नतीजा स्पष्ट रूप से 5 है, क्योंकि यह एक पूर्णांक विभाजन है (उचित अंग्रेजी शब्द नहीं जानते)।

1

आप सही हैं। असाइनमेंट किए जाने तक CASE 2 पूर्णांक अंकगणित का उपयोग करता है। तुम भी एक स्पष्ट डाली बनाकर इस समस्या को ठीक कर सकते हैं:

double auxMedia1 = ((double) (5 + 6))/2; 
5

मार्क के (सही) पर विस्तार करने के लिए एक सा जवाब देने, पूर्ण संख्याओं, पूर्णांक के रूप में व्याख्या कर रहे हैं, जबकि दशमलव अंकों के साथ यह संख्या दोगुनी के रूप में व्याख्या कर रहे हैं। एक शाब्दिक डबल के रूप में एक पूर्ण संख्या घोषित करने के लिए, इसे "डी" संलग्न करें:

 //CASE 2b, result 5.5 
     double auxMedia2b = (5D + 6D)/2;