मैं इस छोटे से कोड लिखा है:printf
#include <stdio.h>
int main() {
size_t temp;
temp = 100;
printf("lld=%lld, ld=%ld, u=%u\n", temp, temp, temp);
return 0;
}
मैं जीसीसी संस्करण के साथ एक i386 जीएनयू/लिनक्स मशीन पर यह चल रहा 4.1.1 20,070,105 (रेड हैट 4.1.1-52)।
lld=429496729700, ld=100, u=7993461
मैं समझ सकता है कि पहले (lld
) कचरा के रूप में मुद्रित किया गया था क्योंकि printf
की कोशिश करता है (जैसा कि lld
द्वारा संकेतित signed long long
के लिए) 8 बाइट्स मुद्रित करने के लिए जब केवल 4 बाइट उपलब्ध हैं: यह आउटपुट है कि मुझे मिल गया है परिवर्तनीय temp
से। लेकिन, मैं समझने में असफल रहा कि अंतिम पहचानकर्ता, u
कचरा के रूप में मुद्रित क्यों हो रहा है - जबकि, मेरी समझ में यह size_t
के लिए निकटतम लागू पहचानकर्ता है।
यहां मैंने माना है कि size_t
unsigned int
है (जो मेरे i386 के लिए 4 बाइट्स पर हस्ताक्षर है)।
अब, मैं printf
लाइन के साथ एक छोटे से फेरबदल किया:
...
printf("ld=%ld, u=%u, lld=%lld\n", temp, temp, temp);
...
और मैं एक बिल्कुल ठीक जवाब (lld
भाग को छोड़कर)।
ld=100, u=100, lld=34331653576851556
क्या कोई मुझे समझने में मेरी सहायता कर सकता है कि मैं वास्तव में क्या खो रहा हूं?
किसी भी मदद के लिए बहुत बहुत धन्यवाद!
[ओर ध्यान दें: मैं अवलोकन में कोई अंतर के बिना/बंद gcc -O[0,2]
टैग का उपयोग कर अनुकूलन स्विचन की कोशिश की।]
द -फॉर्मैट विकल्प शायद आपके लिए इस असंगतता का पता लगाएगा। – Clifford
@Clifford इनपुट के लिए धन्यवाद - लेकिन, मैं जानबूझ कर गलत विनिर्देशकों का उपयोग कर रहा था। मैं वास्तव में जानना चाहता था कि कैसे 'printf' ढेर पर तत्वों का उपभोग कर रहा था। असल में, मुझे लगता है -Wall भी वही बात होगी। फिर भी, बहुत बहुत धन्यवाद। – Shrey
मुझे एहसास हुआ कि यह जानबूझकर था; लेकिन मेरा मुद्दा यह था कि यदि इरादा संकलक के व्यवहार का पालन करना था, तो -फॉर्मैट विकल्प वैकल्पिक (और सुरक्षित) व्यवहार का प्रदर्शन करता है, जो किसी के लिए ब्याज का हो सकता है, भले ही आप पहले से ही इसके बारे में जानते हों। -वॉल में शामिल नहीं था - जीसीसी के पुराने संस्करणों पर वर्फैट। – Clifford