প্রিন্টফের পক্ষে কী যুক্তি রয়েছে যা দীর্ঘ বিন্যাস করে?


487

printfফাংশন যেমন একটি আর্গুমেন্ট টাইপ লাগে %dবা %iএকটি জন্য signed int। যাইহোক, আমি একটি longমানের জন্য কিছুই দেখতে পাচ্ছি না ।


দীর্ঘ ব্যবহার করবেন না, এটি পোর্টেবল নয়। stackoverflow.com/questions/16859500/mmh-who-are-you-priu64
মার্চ

উত্তর:


633

lস্পেসিফায়ারের সরাসরি সরাসরি একটি (ছোট হাতের অক্ষর এল) রাখুন ।

unsigned long n;
long m;

printf("%lu %ld", n, m);

14
printf("%ld", ULONG_MAX)মান -1 হিসাবে আউটপুট করে। printf("%lu", ULONG_MAX)নীচে @ ব্লগারবার্ড দ্বারা বর্ণিত হিসাবে স্বাক্ষরবিহীন দীর্ঘতর হওয়া উচিত ।
জামস

2
আসলে, %ldওপি প্রশ্নের সাথে আরও সুরেলা হওয়ার জন্য আপনার এটি হওয়া উচিত ।
ডাঃ বেকো

ইয়েপ ডাঃ বেকো; আরও, কেবল %lট্রিগারwarning: unknown conversion type character 0x20 in format [-Wformat]
প্যাট্রিজিও বার্তোনি


73

বেশিরভাগ প্ল্যাটফর্মে longএবং intএকই আকারের (32 বিট)। তবুও এর নিজস্ব ফর্ম্যাট স্পেসিফায়ার রয়েছে:

long n;
unsigned long un;
printf("%ld", n); // signed
printf("%lu", un); // unsigned

64 বিটের জন্য, আপনি একটি চাই long long:

long long n;
unsigned long long un;
printf("%lld", n); // signed
printf("%llu", un); // unsigned

ওহ, এবং অবশ্যই, এটি উইন্ডোজে পৃথক:

printf("%l64d", n); // signed
printf("%l64u", un); // unsigned

প্রায়শই, যখন আমি -৪-বিট মানগুলি মুদ্রণ করি তখন আমি এগুলিকে হেক্সে মুদ্রণ করা সহায়ক মনে করি (সাধারণত যে সংখ্যাগুলি বড়, তারা পয়েন্টার বা বিট ক্ষেত্র হয়)।

unsigned long long n;
printf("0x%016llX", n); // "0x" followed by "0-padded", "16 char wide", "long long", "HEX with 0-9A-F"

মুদ্রণ করবে:

0x00000000DEADBEEF

বিটিডব্লিউ, "দীর্ঘ" এর অর্থ আর বেশি নয় (মূলধারার x64 এ)। "ইনট" হল প্ল্যাটফর্মের ডিফল্ট ইনট আকার, সাধারণত 32 বিট। "দীর্ঘ" সাধারণত একই আকারের হয়। তবে তাদের পুরানো প্ল্যাটফর্মগুলিতে (এবং আধুনিক এমবেডেড প্ল্যাটফর্মগুলি!) আলাদা আলাদা পোর্টেবিলিটি শব্দার্থক শব্দ রয়েছে। "দীর্ঘ দীর্ঘ" হ'ল একটি -৪-বিট সংখ্যা এবং সাধারণত লোকেরা কী বোঝাতে চেয়েছিল যদি না তারা সত্যিই বুঝতে না পারে যে তারা এক্স-প্ল্যাটফর্মের পোর্টেবল কোডের কোনও অংশ সম্পাদনা করছে। তারপরেও তারা সম্ভবত ম্যাক্রোর পরিবর্তে এই ধরণের অর্থের অর্থ (যেমন uint64_t) ক্যাপচার করতে পারে।

char c;       // 8 bits
short s;      // 16 bits
int i;        // 32 bits (on modern platforms)
long l;       // 32 bits
long long ll; // 64 bits 

দিন ফিরে, "ইনট" 16 বিট ছিল। আপনি এখন ভাবেন যে এটি এখন be৪ বিট হবে তবে না, এটি পাগল বহনযোগ্যতার সমস্যার কারণ হতে পারে। অবশ্যই এটি ত্রৈমাসিক এবং ইতিহাস সমৃদ্ধ সত্যের সরলীকরণ। উইকি দেখুন : পূর্ণসংখ্যা


@ এমএম আমি বিভ্রান্তি এড়াতে আমার উত্তর পরিষ্কার করে দিয়েছি।
ডেভ ডপসন

4
কেবল স্পষ্ট করে বলার জন্য: x86 এবং x64 এর চেয়ে বেশি আর্কিটেকচার রয়েছে এবং সেগুলি আর্কিটেকচারগুলিতে চর, সংক্ষিপ্ত, অভ্যন্তরীণ, দীর্ঘ এবং দীর্ঘ দীর্ঘ অর্থ ভিন্ন। উদাহরণস্বরূপ, 16 বিট মেমরি প্রান্তিককরণ সহ একটি 32 বিট এমসিইউ ব্যবহার করতে পারে: চর = সংক্ষিপ্ত = ইনট = 16 বিট; দীর্ঘ = 32 বিট; দীর্ঘ দীর্ঘ = 64 বিট
AndresR

1
@ অ্যান্ড্রেসআর - একেবারে, এবং এম্বেড করা প্রোগ্রামিং করা লোকদের কাছে এটি অত্যন্ত গভীরভাবে গুরুত্বপূর্ণ (আমি একবার ধূমপানের এলার্মের জন্য একটি কার্নেল মডিউল তৈরি করেছি)। এই দরিদ্র আত্মার প্রতি দয়া করুন যখন তারা এমন কোড ব্যবহারের চেষ্টা করেন যা বহনযোগ্যতার জন্য লেখা হয় নি।
ডেভ ডপসন

আমি এতটা নিশ্চিত নই যে "বেশিরভাগ প্ল্যাটফর্মের longআকার 32 এর আকারের" এখনও সত্য। যেমন, আমি ওরাকল লিনাক্স, x86_64 / AMD64 উপর আছি, এবং nvccএকটি long8 বাইট।
ragerdl

"ওহ, এবং অবশ্যই উইন্ডোজের ক্ষেত্রে এটি আলাদা"। একটি ক্রস প্ল্যাটফর্ম সমাধান আছে?
অ্যারন ফ্র্যাঙ্ক

17

এটি নির্ভর করে, যদি আপনি স্বাক্ষরযুক্ত দীর্ঘ বিন্যাসের চরিত্রটি উল্লেখ করছেন "%lu"। আপনি স্বাক্ষর করা দীর্ঘ দীর্ঘ উল্লেখ করছেন যদি বিন্যাস অক্ষর হয় "%ld"



12

আপনি unsigned long longযেমনটি মুদ্রণ করতে চাইছেন তেমন ব্যবহার করুন:

unsigned long long n;
printf("%llu", n);

অন্যান্য সমস্ত সংমিশ্রণের জন্য, আমি বিশ্বাস করি যে আপনি প্রিন্টফ ম্যানুয়াল থেকে সারণীটি সারিটি ব্যবহার করেন, তারপরে আপনি যে ধরণের প্রিন্ট করার চেষ্টা করছেন তার জন্য কলাম লেবেল (যেমন আমি printf("%llu", n)উপরের সাথে করি )।


0

আমি মনে করি এই প্রশ্নের উত্তর দেওয়ার জন্য অবশ্যই আপনি যে সংকলকটির নাম এবং সংস্করণটি ব্যবহার করছেন তা এবং প্ল্যাটফর্মটি (সিপিইউ টাইপ, ওএস ইত্যাদি) যা এটি সংকলন করছে তা জেনে রাখা দরকার।


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