इस कार्यक्रमprintf में फ़्लोट/डबल से int को संभालने का रूपांतरण कैसा है?
int main()
{
float f = 11.22;
double d = 44.55;
int i,j;
i = f; //cast float to int
j = d; //cast double to int
printf("i = %d, j = %d, f = %d, d = %d", i,j,f,d);
//This prints the following:
// i = 11, j = 44, f = -536870912, d = 1076261027
return 0;
}
कोई व्याख्या कर सकते हैं क्यों पूर्णांक के लिए डबल/नाव से कास्टिंग पहले मामले में ठीक से काम करता है, और जब printf में किया काम नहीं करता है पर विचार करें?
यह प्रोग्राम 32-बिट लिनक्स मशीन पर gcc-4.1.2 पर संकलित किया गया था।
संपादित करें: Zach's answer लगता प्रारूप विनिर्देशक के तार्किक है, यानी उपयोग यह पता लगाने के लिए रवाना पॉप क्या ढेर। हालांकि फिर इस अनुवर्ती प्रश्न पर विचार करें:
int main()
{
char c = 'd'; // sizeof c is 1, however sizeof character literal
// 'd' is equal to sizeof(int) in ANSI C
printf("lit = %c, lit = %d , c = %c, c = %d", 'd', 'd', c, c);
//this prints: lit = d, lit = 100 , c = d, c = 100
//how does printf here pop off the right number of bytes even when
//the size represented by format specifiers doesn't actually match
//the size of the passed arguments(char(1 byte) & char_literal(4 bytes))
return 0;
}
यह कैसे काम करता है?
मुझे भी इसी तरह का संदेह था। यह धागा देखें: http://stackoverflow.com/questions/2377733/how-does-this-program-work – Lazer
char एक एकल वर्ण है - यह केवल 8-बिट पूर्णांक है। जब आप इंटीग्रल प्रकार पर किसी प्रकार का ऑपरेशन करते हैं जो int से छोटे होते हैं, तो उन्हें पूर्णांक में पदोन्नत किया जाता है। फ़ंक्शन को कॉल करते समय इसमें शामिल है। तो वास्तव में यह आपके प्रिंटफ कॉल को काम करने के कारण यादृच्छिक मौका नहीं है, यह व्यवहार परिभाषित किया गया है। व्यावहारिक रूप से बोलते हुए, अधिकांश सी एबीआई में आप हमेशा स्टैक पर पारित प्रति चर कम से कम एक मशीन शब्द आवंटित करते हैं। –
@ सूरजजैन हां, ' 'पैरामीटर केवल डिफ़ॉल्ट तर्क पदोन्नति (सी 11 §6.5.2.2/6, §7.16.1.1/2) के अनुसार प्रचारित प्रकारों को पारित करता है, जो गारंटी देता है कि' char' और 'int' को संगत बनाया गया है । हालांकि, यह अंकगणित के लिए उपयोग किए जाने वाले प्रचारों के समान नहीं है। साथ ही, एबीआई के मामले में भाषा के बारे में तर्क करना खतरनाक है।यह पुष्टि करना कि ठीक है नियमों की जांच करने के लिए वास्तव में ठीक है। –
Potatoswatter