আপনি কীভাবে একটি স্বাক্ষরবিহীন দীর্ঘ দীর্ঘ ইনট প্রিন্টফ ব্যবহার করে ফর্ম্যাট করবেন?


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
আমি স্রেফ আপনার কোডটি (% llu সহ) gcc এর সাথে সংকলন করেছি এবং আউটপুটটি সঠিক ছিল। আপনি কি সংকলকটিতে কোনও বিকল্প পাস করছেন?
জুয়ান

2
দ্রষ্টব্য যে স্যামসুং বদার নতুনলিব "% lld" সমর্থন করে না বলে মনে হচ্ছে: developer.bada.com/forum/…
আরজেআর


আমি stdint.h ব্যবহার করে এবং আপনার ভেরিয়েবলের বিটের সংখ্যা সম্পর্কে সুস্পষ্ট থাকার পরামর্শ দেব। আমরা এখনও 32 এবং 64 বিট আর্কিটেকচারের মধ্যে রূপান্তরের সময়কালে রয়েছি এবং "স্বাক্ষরবিহীন দীর্ঘ দীর্ঘ ইন্টি" উভয়ের ক্ষেত্রে একই জিনিস বোঝায় না।
এ রিভেনহিলের বিডি

উত্তর:


483

ইউ (স্বাক্ষরযুক্ত) রূপান্তরকরণের সাথে ll (এল-এল) দীর্ঘ-দীর্ঘ পরিবর্তনকারী ব্যবহার করুন। (উইন্ডোতে কাজ করে, জিএনইউ)।

printf("%llu", 285212672);

11
বা সুনির্দিষ্টভাবে বলতে গেলে এটি GNU libc এর জন্য, এবং মাইক্রোসফ্টের সি রানটাইমের সাথে কাজ করে না।
মার্ক বাকের

168
এটি লিনাক্স / ইউনিক্সের জিনিস নয়, "এলএল" দৈর্ঘ্য সংশোধনকারীটি সি 99 এ স্ট্যান্ডার্ড সিতে যুক্ত করা হয়েছিল, যদি এটি "মাইক্রোসফ্ট সি" তে কাজ না করে তবে কারণ এটি মানদণ্ডের সাথে সামঞ্জস্যপূর্ণ নয়।
রবার্ট গাম্বল

12
VS2008 এ আমার জন্য কাজ করে। তদুপরি, আমি যতদূর মনে করি এমএস সি সংকলক (যখন সরাসরি সি সংকলনের জন্য সেট আপ করা হয়) ডিজাইনের দ্বারা সি 90 অনুগামী বলে মনে করা হয়; সি 99 এমন কিছু জিনিস উপস্থাপন করেছে যা সবাই পছন্দ করে না।
ー パ ー フ ァ ミ コ ン ン

6
এখানে একটি বিষয় মনে রাখবেন যে আপনি যদি একাধিক long longযুক্তি পাস করে থাকেন এবং এর মধ্যে একটির জন্য ভুল ফর্ম্যাটprintf ব্যবহার করেন তবে তার পরিবর্তে বলুন , তবে ভুলটির পরেও ছাপা যুক্তিগুলি সম্পূর্ণভাবে বন্ধ হয়ে যেতে পারে (বা এমনকি ক্র্যাশও হতে পারে) )। মূলত, পরিবর্তনশীল আর্গুমেন্টগুলি কোনও প্রকারের তথ্য ছাড়াই প্রিন্টফের কাছে প্রেরণ করা হয়, সুতরাং যদি ফর্ম্যাট স্ট্রিংটি ভুল হয় তবে ফলাফলটি অনাকাঙ্ক্ষিত। %d%lldprintf
দিমিত্রি

1
হার্ড হার্ব সুটার একটি সাক্ষাত্কারে বলেছে যে মাইক্রোসফ্টের গ্রাহকরা সি 99 এর জন্য জিজ্ঞাসা করবেন না তাই তাদের খাঁটি সি সংকলকটি সি 90 এ হিমায়িত হয়েছে। যদি আপনি সি হিসাবে সংকলন করেন তবে এটি প্রযোজ্য যদি আপনি সি ++ হিসাবে সংকলন করেন, অন্যরা যেমন উপরে উল্লিখিত আছে, আপনার ভাল হওয়া উচিত।
অহকক্স

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ম্যাক্রো সংজ্ঞায়িত?
হ্যাপি_মারমোসেট

4
@ হ্যাপি_মারমোসেট: এগুলি সংজ্ঞায়িত করা হয়েছেinttypes.h
নাথান ফেলম্যান

4
আমার মনে হয় আপনার প্রয়োজন PRIu64এবং PRIu32স্বাক্ষরবিহীন পূর্ণসংখ্যার জন্য।
লাসে ক্লিমন

1
কি inttypes.hমান? এটা হবে না stdint.h?
এমডি এক্সএফ 22'17

2
নোট যে এই সঠিক-চওড়া ধরনের হয় ঐচ্ছিক হিসাবে সেখানে আউট আর্কিটেকচারের যে হয়, হবে না পূর্ণসংখ্যা সেই সঠিক প্রস্থ ধরনের। কেবলমাত্র leastXএবং fastXপ্রকারগুলি (যা প্রকৃতপক্ষে নির্দেশিতের চেয়ে বিস্তৃত হতে পারে) বাধ্যতামূলক।
দেবসোলার

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

এমএসভিএস ব্যবহার করে দীর্ঘ দীর্ঘ (বা __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.

পিআরইউ 64৪ এর রেফারেন্সের জন্য +1, যা আমি কখনই দেখিনি, তবে এটি 64৪ বিট লিনাক্সের (কমপক্ষে) পোর্টেবল বলে মনে হয় না কারণ পিআরআই 64৪ "লু" এর পরিবর্তে "লু" তে প্রসারিত হয়।
বিডি বিডে রিভেনহিল

8
এবং কেন যে খারাপ হবে? উইন্ডোজ ব্যতীত অন্যান্য ওএসের মতো 64৪ বিট লিনাক্সের ক্ষেত্রে একটি লম্বা একটি bit৪ বিটের মান।
রিংডিং

@ বিড্যাটাইভেনহিল লিনাক্স / ইউনিক্স এলপি 64 ব্যবহার করে যার মধ্যে দীর্ঘকাল 64 বিট থাকে
ফুচলভি

1
তবে এটিকে আরও পোর্টেবল করার জন্য এর int64_tপরিবর্তে ব্যবহার করুন কারণ দীর্ঘ থেকে দীর্ঘ দীর্ঘ লম্বা কিছু বাস্তবায়ন থাকতে পারে
ফুক্লভি

এই শীর্ষে করা উচিত! - একটি ছোট আপডেট: ত্রুটি: আক্ষরিক উপর অবৈধ প্রত্যয়; সি ++ 11 এর জন্য আক্ষরিক এবং শনাক্তকারীদের মধ্যে একটি জায়গা প্রয়োজন [-Wreided- ব্যবহারকারী-সংজ্ঞায়িত-আক্ষরিক]
তোফুটিম ২

14

লিনাক্সে এটি হয় %llu এবং উইন্ডোজে এটি রয়েছে%I64u

যদিও আমি পেয়েছি এটি উইন্ডোজ 2000 এ কাজ করে না, সেখানে একটি বাগ রয়েছে বলে মনে হচ্ছে!


উইন্ডোজ সহ, (বা কমপক্ষে উইন্ডোগুলির জন্য মাইক্রোসফ্ট সি সংকলক সহ) রয়েছে% I64d,% I32u, এবং% I32d
জাস্টজেফ

1
উইন্ডোজ 2000 এর সাথে কী করার আছে? সি লাইব্রেরি হ'ল প্রিন্টফ হ্যান্ডল করে।
সিএমিরসিয়া

1
ঠিক আমি যা পর্যবেক্ষণ করেছি। আমি একটি অ্যাপ্লিকেশন লিখেছি যা এই নির্মাণটি ব্যবহার করেছে এবং এটি উইনএক্সপিতে পুরোপুরি কাজ করেছে তবে উইন 2 কেতে আবর্জনা ছড়িয়ে দিয়েছে। হয়তো সিস্টেম কলের সাথে এটি করার কিছু ছিল যা সি লাইব্রেরি কার্নেলের কাছে করছে, সম্ভবত এটি ইউনিকোডের সাথে কিছু করার আছে, কে জানে। আমার মনে আছে _i64tot () বা এর মতো কিছু ব্যবহার করে এটি ঘিরে কাজ করতে হবে to
অ্যাডাম পিয়ার্স

7
এমএস এর মতো আবার "উদ্ভাবনের স্বাধীনতা" অনুশীলন করার মতো শোনায় ... ;-)
ড্রোনজ

উইন 2 কে / উইন 9 এক্স ইস্যুটি সম্ভবত unsigned long longডেটাটাইপ তুলনামূলকভাবে নতুন হওয়ার কারণে (সেই সময়, সি 99 স্ট্যান্ডার্ড সহ) তবে সি সংকলকগুলি (মিনজিডাব্লু / জিসিসি সহ) পুরানো মাইক্রোসফ্ট সি রানটাইম ব্যবহার করেছে যা কেবলমাত্র সি 98-র স্পেসকে সমর্থন করেছে। আমার কাছে কেবলমাত্র সত্যিকারের পুরানো এবং যুক্তিসঙ্গত উইন্ডোজ এপিআই ডক্সে অ্যাক্সেস রয়েছে। সুতরাং I64uসমর্থন কবে বাদ দেওয়া হয়েছিল ঠিক তা বলা শক্ত But তবে এটি এক্সপি-যুগের মতো শোনাচ্ছে।
VeganaiZe

8

এটি ভিএস 2003 এর সাথে এক্স 64 হিসাবে সংকলন করুন:

% llu ভাল কাজ করে।


3

বহু বছর আগে লোকেরা যা লিখেছিল তা ছাড়াও:

  • আপনি এই ত্রুটিটি জিসিসি / মিংডব্লুতে পেতে পারেন:

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

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

তারপরে আপনার মিশ্রওয়ার সংস্করণটি c99 এ ডিফল্ট হবে না। এই কম্পাইলার পতাকা যোগ করুন -std=c99


3

স্পষ্টতই ২০০৮ সাল থেকে [এক] দশক ধরে কেউ মাল্টি-প্ল্যাটফর্ম * সমাধান নিয়ে আসে নি, তাই আমি আমারকে যুক্ত করব 😛 Plz upvote। (জকিং। আমার পাত্তা দিচ্ছে না)

সমাধান: 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-বিট জিসিসির অধীনে আমার জন্য কাজ করে।

*) ভাল, প্রায় বহু প্ল্যাটফর্ম। এমএসভিসিতে আপনার _ui64toa()পরিবর্তে স্পষ্টতই প্রয়োজন lltoa()


1
আমার নেই lltoa
অ্যান্টি হাপালা

1

অ-মানক জিনিস সর্বদা অদ্ভুত :)

গনুহ অধীনে দীর্ঘ দীর্ঘ অংশের জন্য এটা L, llঅথবাq

এবং উইন্ডোসের নীচে আমি বিশ্বাস করি এটি llকেবল


1

হেক্স:

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

আউটপুট:

64bit: FFFFFFFFFFFFFFFF

খুব সুন্দর! আমি ভাবছিলাম কীভাবে আমি এটি হেক্স উপস্থাপনায় পেতে পারি
0xAK

তবে, প্রায় সমস্ত সি ++ এবং সি সংকলক সতর্কতা দেয়: সতর্কতা: 'পি' টাইপ চরিত্রের সাথে 'এলএল' দৈর্ঘ্য সংশোধক ব্যবহার করুন [-ওয়ার্ম্যাট =]
আর

2
এই একদম ভেঙ্গে উত্তর দোকর-অনির্ধারিত আচরণ এবং এমনকি প্রশ্নের উত্তর দিতে শুরু না
অ্যান্টি হাপালা

@ আন্টিহাপালা আপনি বলছেন যে এই উত্তরটি দ্বিগুণ-অপরিজ্ঞাত আচরণের সাথে একেবারে ভেঙে গেছে, আপনি কি ব্যাখ্যা করতে পারবেন বা আমি কেবল এটি মুছতে পারি? বা এটি একটি ভাল খারাপ উদাহরণ হিসাবে রাখা?
lama12345

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' এর পরিবর্তে একটি আসল -৪-বিট নম্বর চেষ্টা করুন এবং আমি বিশ্বাস করি না যে প্রথম উদাহরণটি সঠিকভাবে চলেছে, কোনও লক্ষ্যে সংকলিত।
dyasta
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.