2010-02-16 5 views
9

का उपयोग कर मैं इस कार्यक्रम पर काम कर रहा था और मैंने देखा कि एक फ्लोट के लिए डबल और% डी के लिए% f का उपयोग करके मुझे कुछ अलग मिलता है। कोई जानता है कि ऐसा क्यों होता है?सी printf% d और% f

int main() 
{ 
float a = 1F; 
double b = 1; 

printf("float =%d\ndouble= %f", a, b); 
} 

यह आउटपुट

float = -1610612736 
double = 190359837192766135921612671364749893774625551025007120912096639276776057269784974988808792093423962875123204096.0000 
+0

धन्यवाद। मुझे ये अब मिला। – user69514

उत्तर

4

वैरिएबल पैरामीटर काम करने के तरीके के कारण, सी को उस मान के प्रकार का कोई अंदाजा नहीं है जिसे आप वास्तव में %d और %f के अलावा पास कर रहे हैं। जब आप एक वेरिएबल पैरामीटर में पास करते हैं तो आप मूल रूप से (void*)&myvalue कर रहे हैं क्योंकि न तो कंपाइलर, न ही रन टाइम पर फ़ंक्शन स्वरूपण स्ट्रिंग में दिए गए को छोड़कर चर के प्रकार को निर्धारित कर सकता है। तो भले ही एक निहित रूपांतरण उपलब्ध है, संकलक को पता नहीं है कि इसकी आवश्यकता है।

ठीक है, अधिकांश सिस्टम पर डबल 8 बाइट है जबकि फ्लोट 4 बाइट्स है। तो दो प्रकार बाइनरी संगत नहीं हैं जैसा कि यह है। और यह एक स्ट्रिंग को डबल, या कुछ अन्य असंगत प्रकार के रूप में समझने की कोशिश करना है।

+2

सही है, लेकिन यह वास्तव में 'फ्लोट' और 'डबल' के बीच संगतता के बारे में नहीं है। असल में, 'फ्लोट' प्रकार के विविध तर्कों को हमेशा पास करने से पहले 'डबल' को बढ़ावा दिया जाता है, जिसका अर्थ है कि 'फ्लोट' प्रकार यहां कुछ भी शामिल नहीं है। 'Printf' को पास किए गए दोनों मानों में' डबल' प्रकार है। पहले के अंदर 'int' के रूप में व्याख्या की जाती है ('% d' विनिर्देशक के कारण)। 'Int' और' double' के बीच असंगतता यह है कि मनाए गए अपरिभाषित व्यवहार का कारण क्या है। – AnT

3

यह डेटा की आंतरिक अभ्यावेदन के साथ क्या करना है। आप एक फ्लोट मुद्रित करने की कोशिश कर रहे हैं जैसे कि यह एक int है, जिसमें एक पूरी तरह से अलग आंतरिक (बाइनरी) प्रतिनिधित्व है।

डबल केस समान है। फ्लोट वैरिएबल के बाद आपके पास शायद कचरा (कोई डेटा) हो। उस कचरे को डबल मान के हिस्से के रूप में व्याख्या किया जाता है।

4

%d दशमलव के लिए खड़ा है और यह int (या कुछ छोटे हस्ताक्षरित पूर्णांक प्रकार जो तब प्रचारित हो जाता है) के तर्क की अपेक्षा करता है। फ़्लोटिंग-पॉइंट प्रकार float और double दोनों एक ही तरीके से पास हो जाते हैं (double पर प्रचारित) और दोनों %f का उपयोग करते हैं। सी 99 में आप के बड़े आकार को इंगित करने के लिए %lf का भी उपयोग कर सकते हैं, लेकिन यह पूरी तरह से कॉस्मेटिक है (ध्यान दें कि scanf के साथ कोई पदोन्नति नहीं होती है और यह वास्तव में एक अंतर बनाता है)।

+0

अच्छा, यह सच है http://codepad.org/labE8lgy लेकिन मुझे आश्चर्य है कि वास्तव में यह कैसे काम करता है .. – Earlz

0

% डी एक पूर्णांक प्रिंट करता है, इसलिए आपका printf आपके चर को एक int के रूप में व्याख्या कर रहा है।

जीसीसी 3.4.6 के साथ, मुझे आपके कोड के साथ दोनों मानों के लिए 0 मिल गया है (प्रारंभिक रूप से एफ को बंद करने के बाद, जिसके कारण एक कंपाइलर त्रुटि हुई)। मुझे संदेह है कि इसे एक चर के हिस्से के साथ करना है जिसे एक int 0 के रूप में व्याख्या किया जा रहा है, और उसके बाद संकलक भ्रमित हो जाता है ... (शायद एक बेहतर स्पष्टीकरण है, लेकिन मैं इसके बारे में नहीं सोच सकता)।

मेरे लिए दोनों चर के लिए दोनों चर परिवर्तनीय 1.000000 दोनों के लिए% f का उपयोग करना।

आप इस पृष्ठ तल के पास रूपांतरण पात्रों में से एक सूची प्राप्त कर सकते हैं: सभी टिप्पणियों के लिए

http://www.exforsys.com/tutorials/c-language/managing-input-and-output-operations-in-c.html

+0

'एफ' से जुड़े कंपाइलर त्रुटि इसलिए है क्योंकि इसे पूर्णांक से जोड़ा नहीं जा सकता है (उदा।,' 1.0 एफ' ठीक है)। – RastaJedi