आप प्रिंटफ का उपयोग करके एक लंबे समय तक लंबे प्रारूप को कैसे स्वरूपित करते हैं?


379
#include <stdio.h>
int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    printf("My number is %d bytes wide and its value is %ul. A normal number is %d.\n", sizeof(num), num, normalInt);
    return 0;
}

आउटपुट:

My number is 8 bytes wide and its value is 285212672l. A normal number is 0.

मुझे लगता है कि यह अप्रत्याशित परिणाम मुद्रण से है unsigned long long int। आप कैसे हैं printf()एक unsigned long long int?


2
मैंने सिर्फ gcc के साथ आपका कोड (% llu के साथ) संकलित किया और आउटपुट सही था। क्या आप संकलक के पास कोई विकल्प दे रहे हैं?
जुआन

2
ध्यान दें कि सैमसंग बाडा का न्यूलिब "% lld" का समर्थन नहीं करता है: डेवलपर.
bada.com/forum/…


मैं आपको stdint.h का उपयोग करने का सुझाव दूंगा और आपके चर में बिट्स की संख्या के बारे में स्पष्ट होना चाहिए। हम अभी भी 32 और 64 बिट आर्किटेक्चर के बीच संक्रमण की अवधि में हैं, और "अहस्ताक्षरित लंबे लंबे int" का मतलब दोनों पर एक ही बात नहीं है।
रिद्धनहिल में बीडी

जवाबों:


483

यू (अहस्ताक्षरित) रूपांतरण के साथ ll (एल-एल) लंबे-लंबे संशोधक का उपयोग करें। (विंडोज़, GNU में काम करता है)।

printf("%llu", 285212672);

11
या यह GNU libc के लिए सटीक है, और Microsoft के C रनटाइम के साथ काम नहीं करता है।
मार्क बेकर

168
यह लिनक्स / यूनिक्स की बात नहीं है, "ll" लंबाई संशोधक को C99 में मानक C में जोड़ा गया था, अगर यह "Microsoft C" में काम नहीं करता है, तो यह इसलिए है क्योंकि वे मानक अनुरूप नहीं हैं।
रॉबर्ट गैंबल

12
VS2008 में मेरे लिए काम करता है। इसके अलावा, जहां तक ​​मुझे याद है एमएस सी कंपाइलर (जब सीधे सी को संकलित करने के लिए सेट किया गया है) को डिजाइन के लिए C90 के अनुरूप माना जाता है; C99 ने कुछ ऐसी चीजें पेश कीं जो सभी को पसंद नहीं आईं।
ァ パ ー フ ミ ン

6
यहाँ एक बात ध्यान रखने वाली है कि यदि आप उनमें से किसी एक के लिए गलतlong long तर्क का printfउपयोग कर रहे हैं , और उसके %dबजाय गलत प्रारूप का उपयोग कर रहे हैं%lld , तो यहां तक कि गलत के बाद छपे हुए तर्क पूरी तरह से बंद हो सकते हैं (या printfदुर्घटना का कारण भी बन सकते हैं) )। अनिवार्य रूप से, किसी भी प्रकार की जानकारी के बिना प्रिंट करने के लिए चर तर्क पारित किए जाते हैं, इसलिए यदि प्रारूप स्ट्रिंग गलत है, तो परिणाम अप्रत्याशित है।
दमित्री

1
हर्ड हर्ब सटर एक साक्षात्कार में कहते हैं कि Microsoft के ग्राहक C99 के लिए नहीं पूछते हैं, इसलिए उनका शुद्ध C कंपाइलर C90 पर जमे हुए हैं। यह लागू होता है यदि आप सी के रूप में संकलित कर रहे हैं। यदि आप सी ++ के रूप में संकलित करते हैं, जैसा कि दूसरों ने ऊपर उल्लेख किया है, तो आपको ठीक होना चाहिए।
आहॉक्स

90

आप inttypes.h पुस्तकालय है कि आप इस तरह के रूप प्रकार देता है का उपयोग कर प्रयास कर सकते हैं int32_t, int64_t, uint64_tआदि इसके बाद आप इस तरह के रूप में अपनी मैक्रो का उपयोग कर सकते हैं:

uint64_t x;
uint32_t y;

printf("x: %"PRId64", y: %"PRId32"\n", x, y);

यह "गारंटीकृत" है, ताकि आपको उसी तरह की परेशानी न हो long, unsigned long longआदि, क्योंकि आपको यह अनुमान लगाने की ज़रूरत नहीं है कि प्रत्येक डेटा प्रकार में कितने बिट्स हैं।


ये कहाँ PRId64, PRId32मैक्रोज़ परिभाषित?
Happy_marmoset

4
@happy_marmoset: इन्हें परिभाषित किया गया हैinttypes.h
नाथन

4
मुझे लगता है कि आपको जरूरत है PRIu64और PRIu32अहस्ताक्षरित पूर्णांकों के लिए।
लासे कलिमान

1
है inttypes.hमानक? यह नहीं होगा stdint.h?
एमडी एक्सएफ

2
ध्यान दें कि ये सटीक-चौड़ाई प्रकार वैकल्पिक हैं , क्योंकि वहाँ आर्किटेक्चर हैं जो उन सटीक चौड़ाई के पूर्णांक प्रकार नहीं हैं । केवल leastXऔर fastXप्रकार (जो वास्तव में संकेत से अधिक व्यापक हो सकते हैं) अनिवार्य हैं।
DevSolar

78

%d-> के लिए int

%u-> के लिए unsigned int

%ld-> long intया के लिएlong

%lu-> के लिए unsigned long intया long unsigned intयाunsigned long

%lld-> long long intया के लिएlong long

%llu-> unsigned long long intया के लिएunsigned long long


क्या% lld या% llu के लिए प्रदर्शन, बाएं या दाएं औचित्य की तरह प्रारूप निर्दिष्ट है?
असाम पाडेह

40

MSVS का उपयोग करके लंबे समय तक (या __int64) के लिए, आपको% I64d का उपयोग करना चाहिए:

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i

37

ऐसा इसलिए है क्योंकि% llu विंडोज के तहत ठीक से काम नहीं करता है और% d 64 बिट पूर्णांकों को संभाल नहीं सकता है। मैं इसके बजाय PRIu64 का उपयोग करने का सुझाव देता हूं और आप इसे लिनक्स पर भी पोर्टेबल पाएंगे।

इसके बजाय यह प्रयास करें:

#include <stdio.h>
#include <inttypes.h>

int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    /* NOTE: PRIu64 is a preprocessor macro and thus should go outside the quoted string. */
    printf("My number is %d bytes wide and its value is %" PRIu64 ". A normal number is %d.\n", sizeof(num), num, normalInt);
    return 0;
}

उत्पादन

My number is 8 bytes wide and its value is 285212672. A normal number is 5.

PRIu64 के संदर्भ के लिए +1, जिसे मैंने कभी नहीं देखा था, लेकिन यह 64 बिट लिनक्स (कम से कम) को पोर्टेबल नहीं लगता है क्योंकि PRIu64 "ल्यू" के बजाय "लू" तक फैलता है।
रिद्धनहिल में बीडी

8
और वह बुरा क्यों होगा? एक लंबी 64 बिट लिनक्स पर 64 बिट मूल्य है, जैसे कि विंडोज के अलावा हर दूसरे ओएस पर।
रिंग

@BDatRivenhill लिनक्स / यूनिक्स LP64 का उपयोग करता है जिसमें लंबे समय तक 64 बिट्स हैं
phuclv

1
हालाँकि, इसे और अधिक पोर्टेबल बनाने के लिए, int64_tइसके बजाय उपयोग करें क्योंकि लंबे समय से लंबे समय तक लंबे समय के साथ कुछ कार्यान्वयन हो सकते हैं
phuclv

यह शीर्ष पर होना चाहिए! - एक छोटा अद्यतन: त्रुटि: शाब्दिक पर अमान्य प्रत्यय; C ++ 11 को शाब्दिक और पहचानकर्ता के बीच एक स्थान की आवश्यकता होती है [-विशिष्ट-उपयोगकर्ता-परिभाषित-शाब्दिक]
tofutim

14

लिनक्स में यह है %lluऔर विंडोज में यह है%I64u

हालाँकि मैंने पाया है कि यह विंडोज 2000 में काम नहीं करता है, लेकिन लगता है कि वहाँ एक बग है!


विंडोज़ के साथ, (या कम से कम, विंडोज़ के लिए माइक्रोसॉफ्ट सी कंपाइलर के साथ)% I64d,% I32u, और% I32d भी है
JustJeff

1
विंडोज 2000 के साथ इसका क्या करना है? सी लाइब्रेरी वह है जो प्रिंटफ को संभालती है।
CMircea

1
बस जो मैंने देखा। मैंने एक ऐप लिखा है जो इस निर्माण का उपयोग करता है और इसने पूरी तरह से WinXP पर काम किया लेकिन Win2k पर कचरा फेंक दिया। शायद यह एक सिस्टम कॉल के साथ कुछ करना है जिसे सी लाइब्रेरी कर्नेल के लिए बना रही है, शायद यह यूनिकोड के साथ कुछ करना है, जो जानता है। मुझे याद है कि इसे _i64tot () या कुछ और का उपयोग करके इसके चारों ओर काम करना है।
एडम पियर्स

7
एमएस की तरह लगता है अपनी "स्वतंत्रता को फिर से नया करने के लिए" अभ्यास; ;-)
ड्रोनज़

Win2k / Win9x समस्या unsigned long longडेटाटाइप के अपेक्षाकृत नए होने के कारण होने की संभावना है (उस समय, C99 मानक के साथ), लेकिन C कंपाइलर (मिनगेड / GCC सहित) पुराने Microsoft C रनटाइम का उपयोग करते थे जो केवल C89 युक्ति का समर्थन करते थे। मेरे पास केवल पुराने और यथोचित हाल के विंडोज एपीआई डॉक्स तक पहुंच है। इसलिए यह कहना मुश्किल है कि I64uसमर्थन कब गिरा दिया गया था। लेकिन यह XP-युग की तरह लगता है।
veganaiZe

8

इसे VS645 के साथ x64 के रूप में संकलित करें:

% ल्लु अच्छा काम करता है।


3

लोगों ने वर्षों पहले जो लिखा उसके अलावा:

  • आपको gcc / mingw पर यह त्रुटि मिल सकती है:

main.c:30:3: warning: unknown conversion type character 'l' in format [-Wformat=]

printf("%llu\n", k);

तब mingw का आपका संस्करण c99 के लिए डिफ़ॉल्ट नहीं है। इस संकलक ध्वज जोड़ें -std=c99:।


3

जाहिरा तौर पर कोई भी एक बहु-मंच * समाधान के साथ एक दशक से अधिक के लिए नहीं आया है क्योंकि [2008] वर्ष 2008 है, इसलिए मैं अपना 😛 संलग्न करूंगा। Plz अपवोट। (मजाक करते हुए। मुझे परवाह नहीं है।)

समाधान: lltoa()

कैसे इस्तेमाल करे:

#include <stdlib.h> /* lltoa() */
// ...
char dummy[255];
printf("Over 4 bytes: %s\n", lltoa(5555555555, dummy, 10));
printf("Another one: %s\n", lltoa(15555555555, dummy, 10));

ओपी का उदाहरण:

#include <stdio.h>
#include <stdlib.h> /* lltoa() */

int main() {
    unsigned long long int num = 285212672; // fits in 29 bits
    char dummy[255];
    int normalInt = 5;
    printf("My number is %d bytes wide and its value is %s. "
        "A normal number is %d.\n", 
        sizeof(num), lltoa(num, dummy, 10), normalInt);
    return 0;
}

%lldप्रिंट प्रारूप स्ट्रिंग के विपरीत , यह विंडोज पर 32-बिट जीसीसी के तहत मेरे लिए काम करता है

*) खैर, लगभग बहु-मंच। MSVC में, आपको स्पष्ट रूप से _ui64toa()इसके बजाय की आवश्यकता होती है lltoa()


1
मेरे पास नहीं है lltoa
एंटटी हापाला १ '

1

गैर-मानक चीजें हमेशा अजीब होती हैं :)

GNU के तहत लंबे लंबे हिस्से के लिए L, llयाq

और खिड़कियों के नीचे मेरा मानना ​​है कि यह llकेवल है


1

हेक्स:

printf("64bit: %llp", 0xffffffffffffffff);

आउटपुट:

64bit: FFFFFFFFFFFFFFFF

बहुत अच्छा! मैं सोच रहा था कि मैं इसे हेक्स प्रतिनिधित्व में कैसे प्राप्त कर सकता
हूं

लेकिन, लगभग सभी सी ++ और सी कंपाइलर्स चेतावनी देते हैं: चेतावनी: 'पी' प्रकार के चरित्र के साथ 'll' लंबाई संशोधक का उपयोग [-रूपत =]
शेषाद्री आर

2
इस पूरी तरह से टूटे हुए उत्तर में दोहरावदार व्यवहार है और इस सवाल का जवाब देना भी शुरू नहीं करता है
अंती हापाला

@AnttiHaapala आप कहते हैं कि यह उत्तर पूरी तरह से अपरिभाषित व्यवहार से टूट गया है, क्या आप इसे विस्तृत कर सकते हैं या मैं इसे हटा दूंगा? या इसे एक अच्छे बुरे उदाहरण के रूप में रखें?
लामा ४२४५

0

खैर, इसका एक तरीका VS2008 के साथ x64 के रूप में संकलित करना है

यह उम्मीद के मुताबिक चलता है:

int normalInt = 5; 
unsigned long long int num=285212672;
printf(
    "My number is %d bytes wide and its value is %ul. 
    A normal number is %d \n", 
    sizeof(num), 
    num, 
    normalInt);

32 बिट कोड के लिए, हमें सही __int64 प्रारूप निर्दिष्ट% I64u का उपयोग करने की आवश्यकता है। तो यह बन जाता है।

int normalInt = 5; 
unsigned __int64 num=285212672;
printf(
    "My number is %d bytes wide and its value is %I64u. 
    A normal number is %d", 
    sizeof(num),
    num, normalInt);

यह कोड 32 और 64 बिट वीएस कंपाइलर दोनों के लिए काम करता है।


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