मेरे प्रश्न एकाधिक बिट-गहराई प्लेटफॉर्म (उदाहरण के लिए 32/64) के निर्माण के लिए प्रयास करते समय चीजों को लॉग करने के लिए printf का उपयोग करने का प्रयास करने से रोकते हैं।क्या printf तर्कों में प्रकारों को बढ़ावा देना खतरनाक है?
एक समस्या जो उसके बदसूरत सिर को बरकरार रखती है वह कई आर्किटेक्चर पर इन्ट्स प्रिंट करने की कोशिश कर रही है। 32 बिट पर यह
printf(" my int: %d\n", myInt);
की तरह कुछ होगा, लेकिन 64 बिट पर है, यह मैं दो संबंधित प्रश्न पूछना चाहते हैं
print (" my int: %ld\n", (long)myInt);
के लिए बदला जा करने के लिए होगा:
मेरी पहली सोचा यह था कि जब आप एक चर को मुद्रित करने के लिए printf को बताते हैं, तो इसे एक प्रारूप देते हुए, यह उस चर के पते को देखेगा और उस प्रारूप के लिए आवश्यक कई बाइट्स को पकड़ लेगा। यह पहली बार एक बड़ी समस्या की तरह लग रहा था। उदाहरण के लिए यदि आपके पास एक वैरिएबल MyChar था जो एक char (1 बाइट) था, लेकिन% d के प्रारूप विनिर्देशक का उपयोग करता था, जो प्रिंटफ को myChar के पते पर जाने के लिए बताएगा और अगले 4 बाइट्स को एक int की तरह व्यवहार करने के लिए पकड़ लेगा। यदि ऐसा होता है, तो ऐसा लगता है कि printf पड़ोसी चर से कचरा तिथि ले जाएगा (क्योंकि यह 4 बाइट पकड़ रहा था, लेकिन वास्तविक मूल्य केवल 1 बाइट है)। हालांकि यह मामला नहीं है। MyChar का उपयोग करके और% d निर्दिष्ट करके, printf 1 बाइट grabs और फिर ऊपरी 3 बाइट 0 के साथ पैड। क्या मेरी समझ यहां सही है?
यदि उपर्युक्त सत्य है, तो 32/64 बिट मामले में देखी गई समस्याओं के प्रकार से बचने के लिए हमेशा अपने सबसे बड़े मूल्यों तक चर को बढ़ावा देने में कोई वास्तविक नुकसान होता है। उदाहरण के लिए यदि आपके पास एक छोटा चर MyShort है, और एक int variable, myInt, उन्हें हमेशा प्रिंट करने में कोई नकारात्मकता है:
printf ("myShort% ld", (long) myShort); printf ("myInt% ld", (लंबा) myInt);
किसी भी स्पष्टीकरण के लिए धन्यवाद।
[वैरैडिक फ़ंक्शन में स्वचालित प्रकार का प्रचार] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/7084857/automatic-type-promotion-in-variadic- कार्यक्षमता) –
आईएमओ, वास्तव में डुप्लिकेट के नजदीक नहीं । मैं लोगों को बंद करने के बजाए यहां चर्चा जारी रखने के लिए प्रोत्साहित करता हूं। –
आप क्यों मानते हैं कि 'printf ("% d", myInt);' 64-बिट प्लेटफार्मों के लिए बदला जाना है? –