হেক্সের জন্য প্রিন্টফ () বিন্যাসকরণ


190

এটি একটি গুরুত্বপূর্ণ প্রশ্নের চেয়েও একটি কৌতূহল ক্যোয়ারী, তবে কেন যখন হেক্স শীর্ষস্থানীয় শূন্যগুলির সাথে একটি 8 ডিজিটের নম্বর হিসাবে মুদ্রণ করা হয়, তখন কেন %#08Xএটি একই ফলাফলটি প্রদর্শন করে না 0x%08X?

আমি যখন প্রাক্তনটি ব্যবহার করার চেষ্টা করি তখন 08ফর্ম্যাটিং পতাকাটি সরানো হয়, এবং এটি ঠিক সাথে কাজ করে না 8

আবার আমি শুধু কৌতূহল ছিল।


3
মানে 0x%.8X? এটি শূন্যের সাথে সীসা পূরণ করবে । (এটি 0xকেবল একটি উপস্থাপিকা, তবে আপনার সম্ভবত এটি সম্পর্কে অবহিত রয়েছে)।
WhozCraig

উত্তর:


282

#অংশ আপনি একটি দেয় 0xআউটপুট স্ট্রিং। 0এবং xআপনার "8" তালিকাভুক্ত অক্ষর বিরুদ্ধে গণনা 08অংশ। আপনি যদি এটির মতো হতে চান তবে আপনাকে 10 টি অক্ষরের জন্য জিজ্ঞাসা করতে হবে।

int i = 7;

printf("%#010x\n", i);  // gives 0x00000007
printf("0x%08x\n", i);  // gives 0x00000007
printf("%#08x\n", i);   // gives 0x000007

এছাড়াও xআউটপুটযুক্ত অক্ষরগুলির আবরণকে প্রভাবিত করে।

printf("%04x", 4779); // gives 12ab
printf("%04X", 4779); // gives 12AB

শীর্ষ লাইনটি আমার জন্য 14F0x00000007 আউটপুট করে। লিখিত হিসাবে দ্বিতীয় এবং তৃতীয় কাজ।
কোয়ান্টাম্পোটাটো

@ কোয়ান্টাম্পোটাটো - এটি ... বিজোড়। প্রথম এবং তৃতীয় রেখাগুলি তাদের উত্পাদন করা উচিত 0 এর সংখ্যার বাদে অভিন্ন ical আপনার সংকলক / সিস্টেম / কোড লাইন কি এটি তৈরি করেছিল? আপনার মুদ্রিত যে কোনও লাইন আছে তাতে কি কিছু আছে 14F?
মাইক 14

19
মনে রাখবেন যে, যদি i = 0;ব্যবহার করা সংস্করণগুলিতে উপসর্গ %#অন্তর্ভুক্ত থাকে না 0x
জনাথন লেফলার

তবে কীভাবে হেক্স সম্পর্কে: 0x43A66C31C68491C0 আমি নিম্নলিখিতটি চেষ্টা করে দেখেছি: __int64 int64 = 0x43A66C31C68491C0; printf_s ("% # 15X% d", int64, int64); তবে আউটপুট 0XC68491C0, 0x43A66C31C68491C0 নয়
123iamking

উপরের হেক্স 0x43A66C31C68491C0 সম্পর্কে, আমি এটি সমাধান করেছি, সমাধানটি 0x% I64X,% # 15X নয়
123iamking

53

"0x" আটটি অক্ষর গণনার দিকে গণনা করে। আপনি প্রয়োজন "%#010x"

দ্রষ্টব্য যে 0x থেকে 0 যুক্ত #করে না - ফলাফলটি হবে 0000000000- সুতরাং সম্ভবত আপনাকে সম্ভবত "0x%08x"যেভাবেই ব্যবহার করা উচিত ।


34

%#08Xরূপান্তর সাথে মান আগে বসে আবশ্যক 0X; যে স্ট্যান্ডার্ড দ্বারা প্রয়োজনীয়। স্ট্যান্ডার্ডের কোনও প্রমাণ নেই যে উপসর্গটির দৈর্ঘ্যের অংশ হিসাবে গণনা করা ছাড়া স্পেসিফিকেশনের অংশের #আচরণের পরিবর্তন করা উচিত (যাতে আপনি ব্যবহার করতে চান / ব্যবহার করতে পারেন । যদি আমার মতো, আপনার হেক্সস হিসাবে উপস্থাপন করা পছন্দ করেন তবে , তারপরে আপনাকে পছন্দসই ফলাফল অর্জন করতে ব্যবহার করতে হবে You আপনি ব্যবহার করতে পারেন080X%#010X0x1234CDEF0x%08X%#.8X এবং এটি নেতৃস্থানীয় শূন্যগুলি সন্নিবেশ করা উচিত।

নিম্নলিখিত কোডে বিভিন্নতার চেষ্টা করুন:

#include <stdio.h>

int main(void)
{
    int j = 0;
    printf("0x%.8X = %#08X = %#.8X = %#010x\n", j, j, j, j);
    for (int i = 0; i < 8; i++)
    {
        j = (j << 4) | (i + 6);
        printf("0x%.8X = %#08X = %#.8X = %#010x\n", j, j, j, j);
    }
    return(0);
}

একটি RHEL 5 মেশিনে এবং ম্যাক ওএস এক্সে (10.7.5) আউটপুটটি ছিল:

0x00000000 = 00000000 = 00000000 = 0000000000
0x00000006 = 0X000006 = 0X00000006 = 0x00000006
0x00000067 = 0X000067 = 0X00000067 = 0x00000067
0x00000678 = 0X000678 = 0X00000678 = 0x00000678
0x00006789 = 0X006789 = 0X00006789 = 0x00006789
0x0006789A = 0X06789A = 0X0006789A = 0x0006789a
0x006789AB = 0X6789AB = 0X006789AB = 0x006789ab
0x06789ABC = 0X6789ABC = 0X06789ABC = 0x06789abc
0x6789ABCD = 0X6789ABCD = 0X6789ABCD = 0x6789abcd

আমি 0 এর চিকিত্সা দেখে কিছুটা অবাক হই; 0Xউপসর্গটি কেন বাদ দেওয়া হয়েছে তা আমি পরিষ্কার নই , তবে দুটি পৃথক সিস্টেম এটি করার সাথে এটি মানক হতে হবে। এটি #বিকল্পটির বিরুদ্ধে আমার কুসংস্কারগুলি নিশ্চিত করে ।


শূন্যের চিকিত্সা মান অনুযায়ী।

আইএসও / আইইসি 9899: 2011 §7.21.6.1 ফাংশনfprintf

.6 পতাকার অক্ষর এবং তাদের অর্থ হ'ল :
...
#ফলাফলটি "বিকল্প আকারে" রূপান্তরিত হয়। ... x(বা X) রূপান্তরকরণের জন্য, একটি ননজারো ফলাফল এটির 0x(বা 0X) প্রিফিক্স করেছে। ...

(সামনে জোর দাও.)


নোট করুন যে ব্যবহার %#Xকরে হেক্স ডিজিট এবং 0Xউপসর্গ হিসাবে আপার ক্ষেত্রে অক্ষর ব্যবহার করা হবে ; %#xহেক্সস ডিজিটের জন্য এবং 0xউপসর্গ হিসাবে ছোট হাতের অক্ষর ব্যবহার করে ব্যবহার করা হবে । আপনি যদি 0xউপসর্গ এবং বড় হাতের অক্ষর হিসাবে পছন্দ করেন তবে আপনাকে 0xআলাদাভাবে কোড করতে হবে :0x%X । অন্যান্য ফর্ম্যাট সংশোধক অবশ্যই প্রয়োজন হিসাবে যুক্ত করা যেতে পারে।

ঠিকানা মুদ্রণের জন্য <inttypes.h>শিরোনাম এবং uintptr_tপ্রকার এবং PRIXPTRম্যাক্রো ফর্ম্যাটটি ব্যবহার করুন :

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

int main(void)
{
    void *address = &address;  // &address has type void ** but it converts to void *
    printf("Address 0x%.12" PRIXPTR "\n", (uintptr_t)address);
    return 0;
}

উদাহরণ আউটপুট:

Address 0x7FFEE5B29428

দৈর্ঘ্যে আপনার বিষ চয়ন করুন - আমি দেখতে পেয়েছি যে ম্যাকের চলমান ম্যাকোসগুলিতে ঠিকানাগুলির জন্য 12 এর যথার্থতা ভাল কাজ করে। .সর্বনিম্ন নির্ভুলতা (অঙ্কগুলি) নির্দিষ্ট করার জন্য এর সাথে একত্রিত হয়ে এটি নির্ভরযোগ্যভাবে ঠিকানাগুলিকে ফর্ম্যাট করে। আপনি যদি নির্ভুলতা 16 এ সেট করেন তবে ম্যাকের উপরে আমার অভিজ্ঞতায় অতিরিক্ত 4 ডিজিট সর্বদা 0 থাকে তবে অবশ্যই 12-র পরিবর্তে 16 ব্যবহারের জন্য অবশ্যই একটি ক্ষেত্রে তৈরি করা যেতে পারে 64-বিট কোডে (তবে আপনি 8 এর জন্য ব্যবহার করবেন 32-বিট কোড)।

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