2008-09-01 10 views
361

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

उत्तर

464

एक l (लोवरकेस पत्र एल) रखो सीधे विनिर्देशक से पहले देखते हैं।

unsigned long n; 
long m; 

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

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

+4

मेरे उत्तर को सही होने के लिए बदल दिया, क्योंकि यह स्वीकार्य उत्तर है। मैं लोगों को भटकना नहीं चाहता हूं। – postfuturist

+2

असल में, आपको ओपी प्रश्न के साथ अधिक हार्मोनिक होने के लिए इसे '% ld' के रूप में बदलना चाहिए। –

179

मुझे लगता है कि आप का मतलब:

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

या

long n; 
printf("%ld", n); // signed long 
0

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

8

मामले में आप, जैसा कि मैंने था unsigned long long मुद्रित करने के लिए देख रहे हैं उपयोग:

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

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

49

अधिकांश प्लेटफ़ॉर्म पर, 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 

ओह, और निश्चित रूप से, यह अलग Windows में बताया गया है:

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, "लंबे" मतलब यह नहीं है कि ज्यादा अब और (मुख्य धारा 64 पर)। "int" प्लेटफ़ॉर्म डिफ़ॉल्ट 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 बिट्स होगा, लेकिन नहीं, इससे पागल पोर्टेबिलिटी के मुद्दे सामने आएंगे। बेशक, यहां तक ​​कि यह आर्केन और इतिहास समृद्ध सत्य का एक सरलीकरण है।wiki:Integer

+0

@ एमएम मैंने भ्रम से बचने के लिए मेरे उत्तर को स्पष्ट किया। –

+2

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

+0

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

15

यह निर्भर करता है कि यदि आप हस्ताक्षर किए गए लंबे समय तक संदर्भित कर रहे हैं तो स्वरूपण वर्ण "%lu" है। यदि आप हस्ताक्षर किए जाने वाले लंबे प्रारूप का जिक्र कर रहे हैं तो "%ld" है।

संबंधित मुद्दे