आप एक हस्ताक्षरित लंबे लंबे int (कैसे हस्ताक्षर किए लंबे लंबे int int के लिए प्रारूप विनिर्देशक) मुद्रित करते हैं?

#include 
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 कैसे करते हैं?

0
जोड़ा संपादित
विचारों: 4
बिना हस्ताक्षर किए गए int64"> stackoverflow.com/questions/5140871/sprintf-for-unsigned- के लिए
जोड़ा लेखक hippietrail, स्रोत
मैं stdint.h का उपयोग करके और अपने चर में बिट्स की संख्या के बारे में स्पष्ट होने का सुझाव देना चाहूंगा। हम अभी भी 32 और 64 बिट आर्किटेक्चर के बीच संक्रमण की अवधि में हैं, और "हस्ताक्षर किए लंबे लंबे int" का मतलब दोनों पर एक ही बात नहीं है।
जोड़ा लेखक BD at Rivenhill, स्रोत
मैंने बस जीसीसी के साथ अपना कोड (% llu के साथ) संकलित किया और आउटपुट सही था। क्या आप कंपाइलर को कोई विकल्प दे रहे हैं?
जोड़ा लेखक Juan, स्रोत
ध्यान दें कि सैमसंग बाडा की न्यूलिब "% lld" का समर्थन नहीं करती है: developer.bada.com/forum/…
जोड़ा लेखक RzR, स्रोत

9 उत्तर

खैर, एक तरीका यह है कि इसे 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 बिट वीएस कंपाइलर दोनों के लिए काम करता है।

0
जोड़ा

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

for the long long portion under GNU it's L, ll or q

और खिड़कियों के नीचे मुझे विश्वास है कि यह केवल ll है

0
जोड़ा

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

uint64_t x;
uint32_t y;

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

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

0
जोड़ा
@happy_marmoset: उन्हें inttypes.h में परिभाषित किया गया है
जोड़ा लेखक Nathan Fellman, स्रोत
इनट्स दोनों में हैं, इंटीप्प्स में बूल भी होते हैं जो stdbool.h में पाए जा सकते हैं
जोड़ा लेखक user2316602, स्रोत
inttypes.h मानक है? यह stdint.h नहीं होगा?
जोड़ा लेखक MD XF, स्रोत
जहां ये PRId64 , PRId32 मैक्रोज़ परिभाषित किया गया है?
जोड़ा लेखक happy_marmoset, स्रोत
मुझे लगता है कि आपको हस्ताक्षर किए गए पूर्णांक के लिए PRIu64 और PRIU32 की आवश्यकता है।
जोड़ा लेखक Lasse Kliemann, स्रोत

In Linux it is %llu and in Windows it is %I64u

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

0
जोड़ा
एमएस की तरह लगता है कि इसे "नवाचार करने की आजादी" फिर से प्रयोग करें ... ;-)
जोड़ा लेखक Dronz, स्रोत
बस मैंने क्या देखा। मैंने एक ऐप लिखा जिसने इस निर्माण का उपयोग किया और यह WinXP पर पूरी तरह से काम किया लेकिन Win2k पर कचरा थूकना। शायद यह सिस्टम कॉल के साथ कुछ करना है जो सी लाइब्रेरी कर्नेल को बना रहा है, शायद यह यूनिकोड के साथ कुछ करना है, जो जानता है। मुझे याद है कि _i64tot() या ऐसा कुछ उपयोग कर इसके आसपास काम करना है।
जोड़ा लेखक Adam Pierce, स्रोत
खिड़कियों के साथ, (या कम से कम, विंडोज़ के लिए माइक्रोसॉफ्ट सी कंपाइलर के साथ)% I64d,% I32u, और% I32d भी है
जोड़ा लेखक JustJeff, स्रोत
विंडोज 2000 के साथ क्या करना है? सी लाइब्रेरी वह है जो printf को संभालती है।
जोड़ा लेखक CMircea, स्रोत

हेक्स:

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

आउटपुट:

64bit: FFFFFFFFFFFFFFFF
0
जोड़ा
लेकिन, लगभग सभी सी ++ और सी कंपाइलर चेतावनी देते हैं: चेतावनी: 'पी' प्रकार के चरित्र के साथ 'll' लंबाई संशोधक का उपयोग [-Wformat =]
जोड़ा लेखक Seshadri R, स्रोत
बहुत अच्छा! मैं सोच रहा था कि मैं इसे हेक्स प्रतिनिधित्व में कैसे प्राप्त कर सकता हूं
जोड़ा लेखक RE-Beginner, स्रोत

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

printf("%llu", 285212672);
0
जोड़ा
यह एक लिनक्स / यूनिक्स चीज नहीं है, "ll" लम्बाई संशोधक सी 99 में मानक सी में जोड़ा गया था, अगर यह "माइक्रोसॉफ्ट सी" में काम नहीं करता है तो ऐसा इसलिए होता है क्योंकि वे मानक अनुरूप नहीं हैं।
जोड़ा लेखक Robert Gamble, स्रोत
विंडोज़ पर टर्बो सी ++ में काम करता है
जोड़ा लेखक Patrick McDonald, स्रोत
मुझे समझ में नहीं आता है कि इस तरह के एक अति उत्साही उत्तर अभी तक क्यों स्वीकार नहीं किया गया है।
जोड़ा लेखक 0decimal0, स्रोत
वीएस 2008 में मेरे लिए काम करता है। इसके अलावा, जहां तक ​​मुझे एमएस सी कंपाइलर याद है (जब सीधे सी संकलन करने के लिए सेट किया गया है) को डिजाइन द्वारा सी 9 0 का अनुपालन माना जाता है; सी 99 ने कुछ चीजें पेश कीं जो सभी को पसंद नहीं आया।
जोड़ा लेखक スーパーファミコン, स्रोत
सब कुछ 64 बिट मशीन के साथ बदलता है
जोड़ा लेखक Antarus, स्रोत
हेक्स आउटपुट के लिए, एक हस्ताक्षरित लंबे समय तक% I64x के साथ मुद्रित किया जाएगा। वर्चुअल पोर्टेबल तरीका संख्या को intmax_t पर डालना और PRIXMAX का उपयोग करना है। और एक जीएनयू कंपाइलर में PRIXMAX या C ++ के साथ ऐसा कुछ भी उपयोग करने के लिए, आपको #__fDC_FORMAT_MACROS परिभाषित करना होगा। और जिन स्थितियों में मैं वर्णन कर रहा हूं, प्रिक्समैक्स I की परिभाषा गलत है और मुझे% I64X को मजबूर करना पड़ता है जो काम करता है।
जोड़ा लेखक cardiff space man, स्रोत
एक लंबे लंबे हस्ताक्षर किए गए int के साथ x86_64 (x86_64-w64-mingw32-g ++)% lx को क्रॉस-कंपाइल करने वाले सिग्विन कंपाइलर का उपयोग करना एक त्रुटि देता है कि प्रारूप और प्रकार एक साथ नहीं जाते हैं, और समान चर के साथ% llx का उपयोग करते हैं और एक ही संकलक एक त्रुटि देता है कि% llx एक अज्ञात प्रारूप है। और चर वास्तव में एक pthread_t है। तो यह "विंडोज / जीएनयू में काम नहीं करता" और समस्या यह नहीं है कि यह माइक्रोसॉफ्ट के कंपाइलर है।
जोड़ा लेखक cardiff space man, स्रोत
विंडोज पर काम नहीं करता - यह केवल लिनक्स / यूनिक्स के लिए है।
जोड़ा लेखक Paul Hargreaves, स्रोत
या सटीक होने के लिए यह जीएनयू libc के लिए है, और माइक्रोसॉफ्ट के सी रनटाइम के साथ काम नहीं करता है।
जोड़ा लेखक Mark Baker, स्रोत
मैं विजुअल सी ++ 2005 का उपयोग कर रहा हूं और यह ठीक काम करता है
जोड़ा लेखक JProgrammer, स्रोत
यहां ध्यान रखने योग्य एक बात यह है कि यदि आप printf पर एकाधिक लंबे लंबे तर्कों को पारित कर रहे हैं और उनमें से एक के लिए गलत प्रारूप का उपयोग करते हैं, % lld के बजाय % d कहें, फिर भी के बाद मुद्रित तर्क भी गलत हो सकता है (या यहां तक ​​कि printf क्रैश करने के लिए)। अनिवार्य रूप से, परिवर्तनीय तर्क किसी भी प्रकार की जानकारी के बिना printf को पास किए जाते हैं, इसलिए यदि प्रारूप स्ट्रिंग गलत है, तो परिणाम अप्रत्याशित है।
जोड़ा लेखक dmitrii, स्रोत
हेर्ड हर्ब सटर एक साक्षात्कार में कहते हैं कि माइक्रोसॉफ्ट के ग्राहक सी 99 के लिए नहीं पूछते हैं, इसलिए उनके शुद्ध सी कंपाइलर को सी 0 9 में जमे हुए हैं। यह लागू होता है यदि आप सी के रूप में संकलित कर रहे हैं। यदि आप सी ++ के रूप में संकलित करते हैं, जैसा कि अन्य ने उपरोक्त उल्लेख किया है, तो आपको ठीक होना चाहिए।
जोड़ा लेखक ahcox, स्रोत
@Nathan Fellman के उत्तर में PRId64 का उपयोग करें।
जोड़ा लेखक jcoffland, स्रोत

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

इसके बजाए इसे आजमाएं:

#include 
#include 

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.
0
जोड़ा
PRIU64 के संदर्भ के लिए +1, जिसे मैंने कभी नहीं देखा था, लेकिन यह 64 बिट लिनक्स (कम से कम) के लिए पोर्टेबल प्रतीत नहीं होता है क्योंकि PRIU64 "llu" के बजाय "lu" तक फैलता है।
जोड़ा लेखक BD at Rivenhill, स्रोत
हालांकि, इसे और अधिक पोर्टेबल बनाने के लिए, int64_t का उपयोग करें क्योंकि इसके बजाय कुछ कार्यान्वयन लंबे समय से लंबे समय तक बड़े हो सकते हैं
जोड़ा लेखक Lưu Vĩnh Phúc, स्रोत
@BDatRivenhill लिनक्स / यूनिक्स एलपी 64 का उपयोग करता है जिसमें 64 बिट्स लंबा है
जोड़ा लेखक Lưu Vĩnh Phúc, स्रोत
और वह बुरा क्यों होगा? विंडोज़ को छोड़कर हर दूसरे ओएस पर 64 बिट लिनक्स पर एक 64 बिट वैल्यू है।
जोड़ा लेखक Ringding, स्रोत

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

% llu अच्छी तरह से काम करता है।

0
जोड़ा

%d--> for int

%u--> for unsigned int

%ld--> for long int

%lu--> for unsigned long int

%lld--> for long long int

%llu--> for unsigned long long int

0
जोड़ा