2008-10-03 13 views
9

मेरे पास कुछ सी (++) कोड है जो एक uint_64 को स्ट्रिंग में बदलने के लिए sprintf का उपयोग करता है। यह लिनक्स और सोलारिस दोनों के लिए पोर्टेबल होना चाहिए।printf + uint_64?

लिनक्स पर हम% ju का उपयोग करते हैं, लेकिन सोलारिस पर कोई समतुल्य प्रतीत नहीं होता है। मुझे मिल सकता है निकटतम% lu है, लेकिन यह गलत आउटपुट उत्पन्न करता है। कुछ नमूना कोड:

#include <stdio.h> 
#include <sys/types.h> 

#ifdef SunOS 
typedef uint64_t u_int64_t; 
#endif 

int main(int argc, char **argv) { 
    u_int64_t val = 123456789123L; 

#ifdef SunOS 
    printf("%lu\n", val); 
#else 
    printf("%ju\n", val); 
#endif 
} 

लिनक्स पर, आउटपुट की अपेक्षा की जाती है; सोलारिस 9 पर (पूछो मत), यह "28"

मैं क्या उपयोग कर सकता हूं?

उत्तर

11

आप inttypes.h उपलब्ध है, तो आप मैक्रो यह प्रदान करता है का उपयोग कर सकते हैं:

printf( "%" PRIu64 "\n", val); 

नहीं सुंदर, लेकिन यह काम करता है (मैं कह रहा जा सकता है कि एक बहुत हाल ही में लग रहे हैं)।

+0

बहुत बढ़िया! यह पूरी तरह से काम किया। धन्यवाद! –

0

आप लंबे समय तक %llu का उपयोग कर सकते हैं। हालांकि, यह बहुत पोर्टेबल नहीं है, क्योंकि long long 64 बिट्स होने की गारंटी नहीं है। :-)

0

यदि आप सनोस सशर्त टाइपिफ़ से बचना चाहते हैं तो stdint.h से uint64_t प्राप्त कर सकते हैं।

+0

लेकिन आपको से PRIu64 की भी आवश्यकता है, और इसमें शामिल है। –

+0

अच्छा बिंदु, धन्यवाद जोनाथन :) –

2

उत्तर इस बात पर निर्भर करता है कि आपका कोड वास्तव में सी या सी ++ है या नहीं। सी में, आपको किसी अन्य प्रकार के बजाय unsigned long long का उपयोग करना चाहिए (यह वर्तमान मानक के अनुरूप है, और long long सी 99 समर्थन तक बहुत आम है), को L के बजाय अपने निरंतर, और उपयोग (जैसा कि किया गया है) उल्लिखित) %llu आपके विनिर्देशक के रूप में। यदि सी 99 के लिए समर्थन मौजूद नहीं है, तो आप कंपाइलर दस्तावेज़ीकरण की जांच कर सकते हैं, क्योंकि ऐसा करने के लिए कोई अन्य मानक तरीका नहीं है। long long कम से कम 64 बिट होने के लिए गारेट किया गया है।

+2

uint64_t मानक के रूप में हर बिट मानक के रूप में लंबे समय तक मानक है। –

7

एक C99 शिकायत प्रणाली पर:

#include <inttypes.h> 

uint64_t big = ...; 
printf("%" PRIu64 "\n", big); 

C99 मानक की धारा 7.8 देखें।

विनिर्देशक हैं {पंचायती राज, SCN} [diouxX] {एन, LEASTN, मैक्स, FASTN, PTR}

कहाँ पंचायती राज printf() परिवार के लिए है, SCN scanf() परिवार के लिए है, घ और मैं हस्ताक्षरित अभिन्न प्रकार के लिए; ओ, यू, एक्स, एक्स octal, दशमलव, हेक्स, और हेक्स के रूप में अप्रमाणित अभिन्न प्रकार के लिए हैं; एन समर्थित चौड़ाई में से एक है; कम से कम और तेज़ उन संशोधकों से मेल खाते हैं; पीटीआर intptr_t के लिए है; और MAX intmax_t के लिए है।