কিভাবে সি তে একটি int64_t টাইপ প্রিন্ট করবেন


298

সি 99 স্ট্যান্ডার্ডটিতে ইন্টিআর_টি এর মতো বাইট আকারের সাথে পূর্ণসংখ্যার টাইপ রয়েছে। আমি নিম্নলিখিত কোড ব্যবহার করছি:

#include <stdio.h>
#include <stdint.h>
int64_t my_int = 999999999999999999;
printf("This is my_int: %I64d\n", my_int);

এবং আমি এই সংকলক সতর্কতা পেয়েছি:

warning: format ‘%I64d expects type int’, but argument 2 has type int64_t

আমি চেষ্টা করেছিলাম:

printf("This is my_int: %lld\n", my_int); // long long decimal

তবে আমি একই সতর্কতা পেয়েছি। আমি এই সংকলকটি ব্যবহার করছি:

~/dev/c$ cc -v
Using built-in specs.
Target: i686-apple-darwin10
Configured with: /var/tmp/gcc/gcc-5664~89/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Apple Inc. build 5664)

সতর্কতা না রেখে আমার_মিন্ট ভেরিয়েবলটি মুদ্রণের জন্য কোন ফর্ম্যাটটি ব্যবহার করা উচিত?


উত্তর:


419

জন্য int64_tটাইপ:

#include <inttypes.h>
int64_t t;
printf("%" PRId64 "\n", t);

uint64_tপ্রকারের জন্য :

#include <inttypes.h>
uint64_t t;
printf("%" PRIu64 "\n", t);

আপনি PRIx64হেক্সাডেসিমালে মুদ্রণ করতেও ব্যবহার করতে পারেন ।

cppreferences.com- এintptr_t ( PRIxPTR) সহ সকল ধরণের জন্য উপলব্ধ ম্যাক্রোগুলির একটি সম্পূর্ণ তালিকা রয়েছে । স্ক্যানফের জন্য আলাদা ম্যাক্রো রয়েছে, যেমন SCNd64


পিআরইউ 16 এর একটি সাধারণ সংজ্ঞা হবে "hu", সুতরাং সংকলনের সময় অন্তর্নিহিত স্ট্রিং-ধ্রুবক কনটেন্টেশন হয়।

আপনার কোড সম্পূর্ণরূপে পোর্টেবল হওয়ার জন্য, আপনি ব্যবহার করা আবশ্যক PRId32এবং তাই মুদ্রণের জন্য উপর int32_tএবং "%d"বা মুদ্রণের জন্য অনুরূপ int


18
ফর্ম্যাট ম্যাক্রো কনস্ট্যান্টগুলির
মাসুদ খারী

12
এবং, যদি লিনাক্সে সি ++ ব্যবহার করা হয় #define __STDC_FORMAT_MACROSতবে অন্তর্ভুক্ত করার আগে নিশ্চিত হন inttypes.h
সিএসএল

17
PRId64একটি ম্যাক্রো যা অভ্যন্তরীণভাবে অনুবাদ করে "lld"। সুতরাং, এটি লেখার মতোই দুর্দান্ত printf("%lld\n", t);দেখুন দেখুন বিবরণ দেখুন: qnx.com/developers/docs/6.5.0/…
গৌরব

24
@ গৌরব, এটি কিছু প্ল্যাটফর্মে সত্য, তবে তা নয়। আমার amd64 লিনাক্স মেশিনে, উদাহরণস্বরূপ, পিআরআইডি 64 হিসাবে সংজ্ঞায়িত করা হয়েছে ld। বহনযোগ্যতা ম্যাক্রোর কারণ।
ইথান টি

10
আমার মনে হয় কিছু অতিরিক্ত প্রচেষ্টা নিয়ে তারা এটিকে আরও খারাপ করে তুলতে পারত
পাভেল পি

64

সি 99 উপায়টি হল

#include <inttypes.h>
int64_t my_int = 999999999999999999;
printf("%" PRId64 "\n", my_int);

বা আপনি নিক্ষেপ করতে পারে!

printf("%ld", (long)my_int);
printf("%lld", (long long)my_int); /* C89 didn't define `long long` */
printf("%f", (double)my_int);

আপনি যদি C89 বাস্তবায়নের সাথে আটকে থাকেন (বিশেষত ভিজ্যুয়াল স্টুডিও) আপনি সম্ভবত একটি মুক্ত উত্স <inttypes.h>(এবং <stdint.h>) ব্যবহার করতে পারেন : http://code.google.com/p/msinttyype/


কোড.google.com লিঙ্ক থেকে এমসিন্টটাইপগুলি ব্যবহার করার সময়, আমাকে __STDC_FORMAT_MACROS সংজ্ঞায়িত করতে হবে। Stackoverflow.com/questions/8132399/how-to-printf-uint64-t দেখুন ।
ariscris

মাথা উঁচু করার জন্য ধন্যবাদ, অ্যারিসক্রিস। এটি ম্যাক্রো কেবল সি ++ এর জন্য প্রয়োজনীয় বলে মনে হয়। সংযুক্ত কোডের #if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS)
সংজ্ঞাগুলি

19

সি 99 এর সাথে %jদৈর্ঘ্যের সংশোধকটি প্রকারের মুদ্রণের জন্য ফাংশনগুলির মুদ্রণ পরিবারের সাথে ব্যবহার করা যেতে পারে int64_tএবং uint64_t:

#include <stdio.h>
#include <stdint.h>

int main(int argc, char *argv[])
{
    int64_t  a = 1LL << 63;
    uint64_t b = 1ULL << 63;

    printf("a=%jd (0x%jx)\n", a, a);
    printf("b=%ju (0x%jx)\n", b, b);

    return 0;
}

এই কোডটি কম্পাইল gcc -Wall -pedantic -std=c99করে কোনও সতর্কতা তৈরি করে না, এবং প্রোগ্রামটি প্রত্যাশিত আউটপুট প্রিন্ট করে:

a=-9223372036854775808 (0x8000000000000000)
b=9223372036854775808 (0x8000000000000000)

এই অনুযায়ী হয় printf(3)আমার লিনাক্স সিস্টেমে (man পৃষ্ঠা বিশেষভাবে বলছেন যে jএকটি করার জন্য একটি রূপান্তর ইঙ্গিত করতে ব্যবহার করা হয় intmax_tবা uintmax_tআমার stdint.h এ উভয় int64_tএবং intmax_tঠিক একই ভাবে, এবং একইভাবে জন্য typedef'd হয় uint64_t)। আমি নিশ্চিত নই যে এটি অন্যান্য সিস্টেমে পুরোপুরি পোর্টেবল কিনা।


12
যদি %jdপ্রেন্টস এ intmax_t, সঠিক অনুরোধ হবে printf("a=%jd (0x%jx)", (intmax_t) a, (intmax_t) a)। একই ধরণের int64_tএবং এটির কোনও গ্যারান্টি নেই intmax_tএবং যদি তা না হয় তবে আচরণটি সংজ্ঞায়িত।
ব্যবহারকারী 4815162342

4
আপনি portably ব্যবহার করতে পারেন %jdমুদ্রণ করতে int64_tমান যদি আপনি স্পষ্টভাবে তাদের রূপান্তর intmax_tতাদের ক্ষণস্থায়ী আগে printf: printf("a=%jd\n", (intmax_t)a)। এটি <inttypes.h>ম্যাক্রোগুলির (আইএমএইচও) কদর্যতা এড়ায়। অবশ্যই এই ধরে নেয় যে আপনার বাস্তবায়ন সমর্থন %jd, int64_tএবং intmax_t, যার মধ্যে সব C99 দ্বারা যোগ করা হয়েছে।
কিথ থমসন

2
@ কিথথম্পসন 'সুদৃশ্যতা' এটিকে অনেক দূরে অত্যন্ত মমতাময়ী সাথী রাখছে। এটা একেবারে জঘন্য। এটা ভয়াবহ। এটা বমি বমি ভাব করছে। এটা বিব্রতকর যে এটি কি। বা কমপক্ষে তাদের বিব্রত হওয়া উচিত, এটিই প্রচলিত। আমি এই ম্যাক্রোগুলি কখনও দেখিনি তবে এই উত্তরটি এবং মন্তব্যগুলি - আপনার অন্তর্ভুক্ত - যা পরামর্শ দিয়েছেন তা-ই করেছি।
প্রাইফটান

@Pryftan আমি চাই না বেশ তাদের বেশ কুশ্রী আপনি কি হিসাবে এটি - এবং আমি সব নিশ্চিত কিভাবে তারা ভাষা পরিবর্তন ছাড়াই একটি কম কুশ্রী পদ্ধতিতে সংজ্ঞায়িত করা যেতে পারে এ নই।
কিথ থম্পসন

@ কিথথম্পসন ওয়েল আমি ধন্যবাদ জানাই আপনি কমপক্ষে 'বেশ' শব্দের উপর চাপ দিয়েছেন। আসলে আসলে তাতে কিছু আসে যায় না। যদিও ম্যাক্রোগুলি সেখানে থাকতে হবে তা আমি দেখতে পাচ্ছি না। আপনি যেমনটি বলেছেন যে বহনযোগ্য ... ইত্যাদি তবে তবে আমি এটিও দেখতে পেলাম কীওয়ার্ডের সংখ্যার বৃদ্ধিও হাতছাড়া হয়ে গেছে।
প্রাইফটান

12

এম্বেড করা বিশ্ব থেকে আসছে, যেখানে এমনকি uclibc সবসময় পাওয়া যায় না, এবং কোডটি পছন্দ করে

uint64_t myval = 0xdeadfacedeadbeef; printf("%llx", myval);

আপনাকে ছদ্মবেশ ছাপছে বা কিছুতেই কাজ করছে না - আমি সর্বদা একটি ক্ষুদ্র সহায়ক ব্যবহার করি, যা আমাকে সঠিকভাবে uint64_t hex ডাম্প করার অনুমতি দেয়:

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

char* ullx(uint64_t val)
{
    static char buf[34] = { [0 ... 33] = 0 };
    char* out = &buf[33];
    uint64_t hval = val;
    unsigned int hbase = 16;

    do {
        *out = "0123456789abcdef"[hval % hbase];
        --out;
        hval /= hbase;
    } while(hval);

    *out-- = 'x', *out = '0';

    return out;
}

আপনি যদি এম্বেড থাকা অ্যাপ্লিকেশনটির জন্য এই সমস্যার মুখোমুখি হন তবে আপনি যা খুঁজছেন এটি এটি। এই সমাধানটি আমার পক্ষে কাজ করেছিল। Thnx @ataraxic।
লোগান 859

8

উইন্ডোজ পরিবেশে, ব্যবহার করুন

%I64d

লিনাক্সে, ব্যবহার করুন

%lld

18
%lldএটির জন্য ফর্ম্যাটটি long long intযা প্রয়োজনীয় হিসাবে একই নয়int64_t<stdint.h>এর জন্য সঠিক ফর্ম্যাটের জন্য একটি ম্যাক্রো রয়েছে int64_t; দেখতে ouah এর উত্তর
কিথ থম্পসন

@ কিথথম্পসন তবে যেহেতু long longকমপক্ষে 64৪ -বিট, printf("%lld", (long long)x);সম্ভবত -0x8000000000000000 ব্যতীত কাজ করা উচিত, long longযদি এই ধরণের দুইটির পরিপূরক ব্যবহার না করা হয় তবে এটি প্রতিনিধিত্বমূলক হতে পারে না ।
পাসকেল কুয়াক

@ পাসলকুয়াক: হ্যাঁ, এটি অভিনেতাদের সাথে কাজ করা উচিত (এবং আপনি যে ব্যতিক্রমটি উল্লেখ করেছেন এটি খুব সম্ভব নয়, কেবলমাত্র এমন সিস্টেমে প্রয়োগ করা যা দু'জনের পরিপূরককে সমর্থন করে তবে এটি ব্যবহার করে না long long)।
কিথ থম্পসন

-3

// ভিসি 6.0 (386 এবং আরও ভাল)

    __int64 my_qw_var = 0x1234567890abcdef;

    __int32 v_dw_h;
    __int32 v_dw_l;

    __asm
        {
            mov eax,[dword ptr my_qw_var + 4]   //dwh
            mov [dword ptr v_dw_h],eax

            mov eax,[dword ptr my_qw_var]   //dwl
            mov [dword ptr v_dw_l],eax

        }
        //Oops 0.8 format
    printf("val = 0x%0.8x%0.8x\n", (__int32)v_dw_h, (__int32)v_dw_l);

শুভেচ্ছা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.