प्रिंटफ़ के लिए तर्क क्या है जो एक लंबा प्रारूप है?


487

printfसमारोह जैसे, एक तर्क प्रकार लेता है %dया %iएक के लिए signed int। हालाँकि, मुझे longमूल्य के लिए कुछ भी दिखाई नहीं देता है ।


लंबे समय तक उपयोग न करें, यह पोर्टेबल नहीं है। stackoverflow.com/questions/16859500/mmh-who-are-you-priu64
मार्ख

जवाबों:


633

lनिर्दिष्ट से पहले सीधे (निचला अक्षर एल) रखो ।

unsigned long n;
long m;

printf("%lu %ld", n, m);

14
printf("%ld", ULONG_MAX)मान -1 के रूप में आउटपुट करता है। जब printf("%lu", ULONG_MAX)तक @Blorgbeard नीचे बताए गए अहस्ताक्षरित लंबे समय तक रहना चाहिए ।
जम्मु

2
वास्तव में, आपको इसे %ldओपी प्रश्न के साथ अधिक सामंजस्यपूर्ण होने के लिए बदलना चाहिए ।
डॉ। बीको

हां डॉ। बीको; इसके अलावा, सिर्फ %lट्रिगरwarning: unknown conversion type character 0x20 in format [-Wformat]
पेट्रीज़ियो बर्टोनी 10


73

अधिकांश प्लेटफार्मों पर, longऔर intसमान आकार (32 बिट्स) हैं। फिर भी, इसका अपना प्रारूप विनिर्देशक है:

long n;
unsigned long un;
printf("%ld", n); // signed
printf("%lu", un); // unsigned

64 बिट्स के लिए, आप एक चाहते हैं long long:

long long n;
unsigned long long un;
printf("%lld", n); // signed
printf("%llu", un); // unsigned

ओह, और निश्चित रूप से, यह विंडोज में अलग है:

printf("%l64d", n); // signed
printf("%l64u", un); // unsigned

अक्सर, जब मैं 64-बिट मानों को प्रिंट कर रहा होता हूं, तो मुझे उन्हें हेक्स में प्रिंट करना मददगार लगता है (आमतौर पर संख्याओं के साथ जो बड़े होते हैं, वे पॉइंटर्स या बिट फ़ील्ड होते हैं)।

unsigned long long n;
printf("0x%016llX", n); // "0x" followed by "0-padded", "16 char wide", "long long", "HEX with 0-9A-F"

प्रिंट होगा:

0x00000000DEADBEEF

Btw, "लंबी" का मतलब यह नहीं है कि अब और मुख्यधारा (x64 पर)। "int" प्लेटफ़ॉर्म डिफ़ॉल्ट इंट साइज़ है, आमतौर पर 32 बिट्स। "लॉन्ग" आमतौर पर एक ही आकार का होता है। हालांकि, पुराने प्लेटफार्मों (और आधुनिक एम्बेडेड प्लेटफार्मों!) पर उनके अलग-अलग पोर्टेबिलिटी शब्दार्थ हैं। "लॉन्ग लॉन्ग" एक 64-बिट संख्या है और आमतौर पर लोग इसका उपयोग तब तक करते हैं जब तक कि वे वास्तव में नहीं जानते थे कि वे एक्स-प्लेटफॉर्म पोर्टेबल कोड के एक टुकड़े का संपादन क्या कर रहे थे। फिर भी, उन्होंने संभवतः टाइप के शब्दार्थ अर्थ (जैसे uint64_t) पर कब्जा करने के बजाय एक मैक्रो का उपयोग किया होगा।

char c;       // 8 bits
short s;      // 16 bits
int i;        // 32 bits (on modern platforms)
long l;       // 32 bits
long long ll; // 64 bits 

वापस दिन में, "int" 16 बिट्स था। आपको लगता है कि यह अब 64 बिट्स होगा, लेकिन नहीं, यह पागल पोर्टेबिलिटी मुद्दों का कारण होगा। बेशक, यहां तक ​​कि यह रहस्यमय और इतिहास-समृद्ध सत्य का सरलीकरण है। विकी देखें : इंटेगर


@MM मैंने भ्रम से बचने के लिए अपना उत्तर स्पष्ट कर दिया।
डेव डॉपसन

4
बस स्पष्ट करने के लिए: x86 और x64 की तुलना में अधिक आर्किटेक्चर हैं, और उन आर्किटेक्चर पर, चार, लघु, इंट, लंबे और लंबे समय के अलग-अलग अर्थ हैं। उदाहरण के लिए, 16 बिट मेमोरी संरेखण के साथ एक 32 बिट mcu का उपयोग कर सकते हैं: char = short = int = 16 bit; लंबी = 32 बिट्स; लंबे लंबे = 64 बिट
एन्ड्रेस RR

1
@AndresR - बिल्कुल, और यह उन लोगों के लिए बहुत गहराई से मायने रखता है जो एम्बेडेड प्रोग्रामिंग करते हैं (मैंने एक बार स्मोक अलार्म के लिए कर्नेल मॉड्यूल बनाया था)। उन गरीब आत्माओं पर दया करें जब वे कोड का उपयोग करने की कोशिश करते हैं जो पोर्टेबिलिटी के लिए नहीं लिखा गया था।
डेव डॉपसन

मुझे यकीन नहीं है कि "अधिकांश प्लेटफार्मों longका आकार 32 है" अभी भी सच है। उदाहरण के लिए, मैं ओरेकल लिनक्स x86_64 / amd64 पर हूँ, और साथ nvccएक long8 बाइट है।
ragerdl

"ओह, और निश्चित रूप से, यह विंडोज में अलग है"। क्या कोई क्रॉस-प्लेटफ़ॉर्म समाधान है?
एरोन फ्रेंके

17

यह निर्भर करता है, यदि आप लंबे समय तक प्रारूपित चरित्र को अनसाइन करने की बात कर रहे हैं "%lu"। यदि आप लंबे समय से हस्ताक्षरित स्वरूपण की बात कर रहे हैं "%ld"



12

यदि आप unsigned long longजैसा था वैसा प्रिंट करना चाहते हैं , तो:

unsigned long long n;
printf("%llu", n);

अन्य सभी संयोजनों के लिए, मेरा मानना ​​है कि आप पंक्ति को लेते हुए प्रिंटफ़ मैनुअल से तालिका का उपयोग करते हैं , फिर जो भी आप प्रिंट करने की कोशिश कर रहे हैं (जैसा कि मैं printf("%llu", n)ऊपर करता हूं ) के लिए कॉलम लेबल ।


0

मुझे लगता है कि इस प्रश्न का उत्तर निश्चित रूप से संकलक के नाम और संस्करण को जानने के लिए आवश्यक होगा, जिसका आप उपयोग कर रहे हैं और मंच (सीपीयू प्रकार, ओएस आदि) जिसे वह संकलित कर रहा है।


आपका उत्तर टिप्पणी होना चाहिए न कि स्वयं उत्तर देना चाहिए।
बजे Jaime Hablutzel
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.