2011-06-09 14 views
21

के साथ 64-बिट पूर्णांक के क्रॉस-प्लेटफ़ॉर्म प्रिंटिंग विंडोज में, यह "% I64d" है। लिनक्स और सोलारिस में, यह "% lld" है।
यदि मैं क्रॉस-प्लेटफ़ॉर्म printfs लिखना चाहता हूं जो long long मान प्रिंट करता है: ऐसा करने का अच्छा तरीका क्या है?प्रिंटफ

long long ll; 
printf(???, ll); 
+1

जाहिर है मैं #if परिभाषित (Win32) की जरूरत है && परिभाषित (PRId64) \ n # PRID64 "I64d" \ n #endif परिभाषित करें। धन्यवाद जो सभी ने उत्तर दिया। – Andrei

+0

आपको अपने प्रकारों को भी देखना चाहिए और '[u] int64_t' को प्रतिस्थापित करने के लिए' typedef' होना चाहिए यदि वे उपलब्ध नहीं हैं। –

+0

64 बिट पूर्णांक और लंबे के बीच क्या अंतर है?मैं दूसरे कार्यक्रम पढ़ रहा हूं और वे पीआरआईडी 64 का उपयोग करते हैं, जिसे मैं समझ नहीं पा रहा हूं। – 1a1a11a

उत्तर

34

के एक जोड़े हैं दृष्टिकोण।

आप सी 99-अनुरूप फैशन में अपना कोड लिख सकते हैं, और फिर संकलक-लेखक आपको नीचे जाने पर सिस्टम-विशिष्ट हैक्स की आपूर्ति कर सकते हैं। (दुःख की बात है कि C99 में नहीं बल्कि आम है।)

#include <stdint.h> 
#include <inttypes.h> 

printf("My value is %10" PRId64 "\n", some_64_bit_expression); 

आपके लक्षित प्रणालियों में से एक <inttypes.h> लागू करने के लिए उपेक्षा की है या किसी अन्य तरीके से दुष्टता के साथ बंद slacked गया है क्योंकि प्रकार सुविधाओं में से कुछ वैकल्पिक हैं, तो आप सिर्फ जरूरत है उस प्रणाली पर PRId64 (या जो कुछ भी) के लिए एक सिस्टम-विशिष्ट #define

दूसरा दृष्टिकोण कुछ ऐसा चुनना है जो वर्तमान में हमेशा 64-बिट्स के रूप में लागू होता है और printf द्वारा समर्थित होता है, और फिर कास्ट किया जाता है। सही नहीं लेकिन यह अक्सर क्या करेंगे:

printf("My value is %10lld\n", (long long)some_64_bit_expression); 
+1

आपने सटीक प्रकार नहीं कहा था जिसे आप प्रिंट कर रहे थे, लेकिन जैसा कि अन्य ने नोट किया है, 'PRId64' विशेष रूप से 'int64_t' के लिए है। यदि आप '' का उपयोग करते हैं तो printf के लिए संबंधित '' मैक्रो होना चाहिए। – DigitalRoss

+1

मैं दोनों उत्तरों, DigitalRoss और Random832 को स्वीकार करना चाहता हूं, यह नहीं पता कि इसे कैसे करें। मेटा फोरम पर फ़ाइलें अनुरोध। – Andrei

+0

देर से टिप्पणी, लेकिन मुझे याद आया कि मुझे अभी भी 'PRID64' से पहले स्ट्रिंग में'% 'की आवश्यकता है, या फिर यह 'some_64_bit_expression' अप्रत्याशित होने के बारे में शिकायत की गई है:' printf ("Foo%" PRId64, some_64_bit_expression); ' – OnlineCop

1

नहीं linux और Solaris पर यह केवल संयोग है कि यह एक 64 बिट प्रकार के लिए lld है। सी 99 इन चीजों को पोर्टेबल PRId64 बनाने के लिए सरल (लेकिन बदसूरत) मैक्रोज़ निर्धारित करता है। चूंकि कुछ विंडोज कंपाइलर्स मानक का पालन नहीं करते हैं, इसलिए दुर्भाग्य से, आप भाग्य से बाहर हो सकते हैं।

संपादित करें: अपने उदाहरण में आप 64 बिट पूर्णांक की तुलना में एक अलग चीज़ का उपयोग कर रहे हैं, अर्थात् long long। यह कुछ आर्किटेक्चर पर 128 हो सकता है। यहां सी 99 में typedef एस है जो आपको प्रकार की न्यूनतम या सटीक चौड़ाई की गारंटी देता है (यदि वे प्लेटफॉर्म पर लागू होते हैं)। इन प्रकारों को inttypes.h हेडर, int64_t के साथ दो फिक्स्ड-चौड़ाई 64 बिट प्रकार के लिए दो पूरक में दर्शाया गया है। शायद या शायद आपके विंडोज कंपाइलर में यह नहीं है।

+0

नोट: 'PRId64' मैक्रो' int64_t' प्रिंट करने के लिए है, 'लंबे समय तक नहीं'। –

+0

@ डायट्रिच, बिल्कुल। मैंने इस तरह के प्रश्न का शीर्षक बताया। लेकिन आप सही हैं, मैं लंबे समय तक एक टिप्पणी जोड़ता हूं। –

2

एमएसवीसी long long और llVisual Studio 2005 से शुरू करता है।

आप 2005 के लिए _MSC_VER macro (>= 1400) का मान देख सकते हैं, या बस पुराने कंपाइलर्स का समर्थन नहीं करते हैं।

यह सी 99 मैक्रोज़ प्रदान नहीं करता है, इसलिए आपको PRId64 का उपयोग करने के बजाय long long पर डालना होगा।

यदि आप एक गैर MSVC संकलक के साथ पुराने MSVC पुस्तकालयों का उपयोग कर रहे मदद नहीं करेगा (मुझे लगता है कि MinGW, कम से कम, printf कि ll का समर्थन करता है का अपना संस्करण प्रदान करता है)

+0

ऐसा लगता है कि एमएस ने msvcrt.dll (कम से कम मेरे Win7 बॉक्स पर) 'll' संशोधक समर्थन जोड़ा है। मैं इससे आश्चर्यचकित हूं। ऐसा लगता है कि मिनजीडब्ल्यू ने इसका समर्थन करने के लिए कुछ खास नहीं किया है (और आखिरी बार मैंने मिनीजीडब्लू के साथ 'll' का उपयोग करने का प्रयास किया था, यह खराब तरीके से विफल रहा)। –

+0

धन्यवाद। मैं कभी नहीं जानता था कि एमएसवीसी समर्थित% lld। – Andrei

+0

मैं दोनों उत्तरों, DigitalRoss और Random832 को स्वीकार करना चाहता हूं, यह नहीं पता कि इसे कैसे करें। मेटा फोरम पर फ़ाइलें अनुरोध। – Andrei

0

विकल्प के रूप में आप इस तरह कोड का उपयोग कर सकते हैं:

uint64_t currentTimeMs = ...; 

printf("currentTimeMs = 0x%08x%08x\n", 
      (uint32_t)(currentTimeMs >> 32), 
      (uint32_t)(currentTimeMs & 0xFFFFFFFF) 
    ); 

या हो सकता है:

printf("currentTimeMs = %u%09u\n", 
      (uint32_t)(currentTimeMs/1000000000), 
      (uint32_t)(currentTimeMs % 1000000000) 
    ); 
संबंधित मुद्दे