প্রিন্টফ পরিবার ব্যবহার করে কেউ কীভাবে আকারের আকার পরিবর্তনশীল মুদ্রণ করতে পারে?


403

আমার টাইপের একটি পরিবর্তনশীল রয়েছে size_tএবং আমি এটি ব্যবহার করে মুদ্রণ করতে চাই printf()। এটিকে পোর্টেবল মুদ্রণের জন্য আমি কোন ফর্ম্যাট স্পেসিফায়ার ব্যবহার করব?

32-বিট মেশিনে, %uসঠিক মনে হচ্ছে। আমি সংকলিত ছিল g++ -g -W -Wall -Werror -ansi -pedantic, এবং কোন সতর্কতা ছিল। তবে আমি যখন code৪-বিট মেশিনে কোডটি সংকলন করি তখন এটি সতর্কতা উত্পন্ন করে।

size_t x = <something>;
printf("size = %u\n", x);

warning: format '%u' expects type 'unsigned int', 
    but argument 2 has type 'long unsigned int'

প্রত্যাশা অনুযায়ী সতর্কতাটি চলে যায়, যদি আমি এটিতে পরিবর্তন করি %lu

প্রশ্নটি হল, আমি কোডটি কীভাবে লিখব, যাতে এটি 32- এবং 64-বিট উভয় মেশিনেই ফ্রি সতর্কতা সংকলন করে?

সম্পাদনা: একটি অনুক্রম হিসাবে, আমি অনুমান করি যে একটি উত্তর হতে পারে ভেরিয়েবলটিকে "পূর্ণ" পূর্ণসংখ্যায় পরিণত করা, যা যথেষ্ট বড়, বলে unsigned longএবং মুদ্রণ করে মুদ্রণ করে %lu। এটি উভয় ক্ষেত্রেই কাজ করবে। অন্য কোনও ধারণা আছে কিনা তা আমি দেখছি।


4
unsigned longআপনার লিবিসি বাস্তবায়ন সংশোধকটিকে সমর্থন না করলে কাস্টিং এ সেরা বিকল্প z; সি 99 স্ট্যান্ডার্ডটি পূর্বে size_tইন্টিজার রূপান্তর র‌্যাঙ্ক বেশি না রাখার পরামর্শ দেয় long, সুতরাং আপনি যুক্তিযুক্ত নিরাপদে
ক্রিস্টোফ



1
উইন্ডোজ প্ল্যাটফর্মে আকার_t দীর্ঘের চেয়ে বড় হতে পারে। সামঞ্জস্যতার কারণে দীর্ঘ সময় সর্বদা 32-বিট হয় তবে আকার_টি 64-বিট হতে পারে। সুতরাং, স্বাক্ষরবিহীন দীর্ঘ কাস্টিং বিট অর্ধেক হারাতে পারে। দুঃখিত :-)
ব্রুস ডসন

উত্তর:


481

zসংশোধক ব্যবহার করুন :

size_t x = ...;
ssize_t y = ...;
printf("%zu\n", x);  // prints as unsigned decimal
printf("%zx\n", x);  // prints as hex
printf("%zd\n", y);  // prints as signed decimal

7
+1 টি। এটি কি সি 99 সংযোজন বা এটিও সি ++ এর সাথেও প্রযোজ্য (আমার কাছে সি 90 নেই)?
অবাকর

6
এটি একটি সি৯৯ সংযোজন এবং printf()২০০৯-১১-০৯ (সিলেটের 84 67২ পৃষ্ঠায় টেবিল 84৪)
ক্রিস্টোফ

3
@ ক্রিসটফ: এটি সর্বশেষ খসড়াতেও নেই, এন 3035।
GManNickG

11
@avakar @ অ্যাডাম রোজেনফিল্ড @ ক্রিসটফ @ জিএমান: তবে, N3035 §1.2 স্বাভাবিক রেফারেন্সগুলিতে কেবল সি 99 মান উল্লেখ করা হয়েছে এবং একই রাজ্যের §17.6.1.2 / 3 "সি স্ট্যান্ডার্ড লাইব্রেরির সুবিধাগুলি সরবরাহ করা হয়েছে।" আমি এই যে মানে, যদি না অন্যথায় নিদিষ্ট ব্যাখ্যা হবে, সবকিছু C99 মান লাইব্রেরিতে সি ++ 0x মান গ্রন্থাগার, C99 অতিরিক্ত বিন্যাস নির্দিষ্টকরী সহ অংশ।
জেমস ম্যাকনেলিস

9
@ অরুনসাহা: এটি কেবলমাত্র C99 এর বৈশিষ্ট্য, সি ++ নয়। আপনি যদি এটির সাথে সংকলন করতে চান তবে আপনাকে -pedanticসি ++ 1x ড্রাফ্ট (অত্যন্ত সম্ভাবনা নেই) সমর্থনকারী একটি সংকলক পেতে হবে, অথবা আপনার কোডটি C99 হিসাবে সংকলিত একটি ফাইলে স্থানান্তর করতে হবে। অন্যথায়, আপনার একমাত্র বিকল্পটি আপনার ভেরিয়েবলগুলিতে কাস্ট করা unsigned long longএবং %lluসর্বাধিক পোর্টেবল হতে পারে।
অ্যাডাম রোজনফিল্ড

88

দেখে মনে হচ্ছে এটি আপনি কোন সংকলকটি ব্যবহার করছেন তার উপর নির্ভর করে (ব্লিচ):

  • gnu বলেছেন%zu (বা %zx, বা %zdতবে এটি এটি স্বাক্ষরিত হয়েছে এমনভাবে প্রদর্শন করে, ইত্যাদি)
  • মাইক্রোসফট বলছে%Iu (অথবা %Ix, অথবা %Idকিন্তু আবার এর, স্বাক্ষরিত যে ইত্যাদি) - কিন্তু CL v19 হিসাবে (ভিসুয়াল স্টুডিও 2015 মধ্যে), মাইক্রোসফট সমর্থন %zu (দেখুন এই উত্তর করতে এই মন্তব্যটি )

... এবং অবশ্যই, যদি আপনি সি ব্যবহার করছেন ++ আপনি ব্যবহার করতে পারেন coutপরিবর্তে Arak দ্বারা প্রস্তাবিত


3
zনিউলিব (অর্থাত্ সাইগউইন)
ক্রিস্টোফ

7
%zdএর জন্য ভুল size_t; এটি সম্পর্কিত স্বাক্ষরিত ধরণের জন্য সঠিক size_t, তবে size_tএটি একটি স্বাক্ষরবিহীন প্রকার।
কিথ থম্পসন

1
@ কিথথম্পসন: আমিও উল্লেখ %zuকরেছি (এবং %zxতারা হেক্স চাইলে)। সত্য যে যথেষ্ট %zuসম্ভবত তালিকায় প্রথম হওয়া উচিত ছিল। সংশোধন করা হয়েছে।
টিজে ক্রাউডার

10
@ টিজে ক্রাউডার: আমার মনে হয় %zdনা যে তালিকাটিতে মোটেই থাকা উচিত। আমি কোনও মান মুদ্রণের %zdচেয়ে ব্যবহারের কোনও কারণ সম্পর্কে ভাবতে পারি না । মানটি ছাড়িয়ে গেলে এটি বৈধও (অপরিজ্ঞাত আচরণ রয়েছে) । (সম্পূর্ণতার জন্য, আপনি অষ্টালের জন্য উল্লেখ করতে পারেন ))%zusize_tSIZE_MAX / 2%zo
কিথ থম্পসন

2
@FUZxxl: POSIX প্রয়োজন হয় না যে ssize_tস্বাক্ষরিত প্রকার সংশ্লিষ্ট হয় size_t, তাই এটি মেলে নিশ্চিত না "%zd"। (এটা সম্ভবত সবচেয়ে বাস্তবায়নের চালু আছে।) Pubs.opengroup.org/onlinepubs/9699919799/basedefs/...
কিথ থম্পসন

59

সি 89 এর জন্য, %luমানটি এখানে ব্যবহার করুন এবং কাস্ট করুন unsigned long:

size_t foo;
...
printf("foo = %lu\n", (unsigned long) foo);

সি 99 এবং এর জন্য, ব্যবহার করুন %zu:

size_t foo;
...
printf("foo = %zu\n", foo);

7
২০১৩ বিবেচনা করে "C99 এবং এর আগে" এবং "প্রাক C99 এর জন্য:" পরামর্শ দিন। সেরা উত্তর.
chux - মনিকা পুনরায় ইনস্টল করুন

8
এটা করো না. এটি bit৪ বিট উইন্ডোতে ব্যর্থ হবে যেখানে আকার_টি bit৪ বিট এবং লম্বা ৩২ বিট।
Yttrill

1
@ ইয়িট্রিল: 64৪-বিট উইন্ডোর উত্তর কী?
জন বোদে

1
@ জনবড সম্ভবত unsigned long long?
জেমস কো

2
অথবা: আপনি একটিতে কাস্ট করতে uint64_tপারেন এবং তারপরে PRIu64মেট্রোটি টাইপ করতে পারেন inttyype.h থেকে, এতে ফর্ম্যাট স্পেসিফায়ার রয়েছে।
জেমস কো

9

উইন্ডোজের পক্ষে অ্যাডাম রোজেনফিল্ডের উত্তরে প্রসারিত।

আমি ভিএস2013 আপডেট 4 এবং ভিএস2015 পূর্বরূপ উভয়ই এই কোডটি পরীক্ষা করেছি:

// test.c

#include <stdio.h>
#include <BaseTsd.h> // see the note below

int main()
{
    size_t x = 1;
    SSIZE_T y = 2;
    printf("%zu\n", x);  // prints as unsigned decimal
    printf("%zx\n", x);  // prints as hex
    printf("%zd\n", y);  // prints as signed decimal
    return 0;
}

VS2015 বাইনারি আউটপুট উত্পন্ন:

1
1
2

যখন ভিএস2013 দ্বারা উত্পাদিত এক বলেছেন:

zu
zx
zd

দ্রষ্টব্য: ssize_tএকটি পসিক্স এক্সটেনশন এবং উইন্ডোজ ডেটা টাইপের ক্ষেত্রেSSIZE_T এটি একই জিনিস , তাই আমি উল্লেখ যুক্ত করেছি।<BaseTsd.h>

অতিরিক্তভাবে, অনুসরণ সি 99 / সি 11 শিরোনাম ব্যতীত সমস্ত সি 99 হেডারগুলি ভিএস2015 পূর্বরূপে উপলব্ধ:

C11 - <stdalign.h>
C11 - <stdatomic.h>
C11 - <stdnoreturn.h>
C99 - <tgmath.h>
C11 - <threads.h>

এছাড়াও, সি 11 এর <uchar.h>এখন সর্বশেষ পূর্বরূপে অন্তর্ভুক্ত রয়েছে।

অধিক বিবরণের জন্য, এই দেখুন পুরাতন এবং নতুন মান অনুরূপ জন্য তালিকা।


VS2013 আপডেট 5 আপডেট 4 আপনাকে দেওয়া ফলাফলের মতোই ফলাফল দেয়।
নাথান কিড

6

সি ++ এ এটি করার বিষয়ে যারা কথা বলছেন তাদের জন্য যা প্রয়োজনীয়ভাবে C99 এক্সটেনশনগুলি সমর্থন করে না, তবে আমি আন্তরিকভাবে বুস্ট :: ফর্ম্যাটটির প্রস্তাব দিই। এটি আকার_t টাইপ আকারের প্রশ্নটি তোলে:

std::cout << boost::format("Sizeof(Var) is %d\n") % sizeof(Var);

যেহেতু আপনাকে বুস্ট :: ফর্ম্যাটে আকারের নির্দিষ্টকরণের প্রয়োজন নেই, আপনি কীভাবে মানটি প্রদর্শন করতে চান তা নিয়েই আপনি চিন্তা করতে পারেন।


4
সম্ভবত %uতারপর চান ।
GManNickG

5
std::size_t s = 1024;
std::cout << s; // or any other kind of stream like stringstream!

8
হ্যাঁ, তবে প্রশ্নকর্তা বিশেষত কোনও নির্দিষ্টকারীর জন্য জিজ্ঞাসা করেন printf। আমি অনুমান করতে পারি যে তাদের কিছু অন্যান্য অস্থির বাধা রয়েছে যা std::coutসমস্যা ব্যবহার করে ।
ডোনাল ফেলো

1
@ ডোনাল আমি ভাবছি যে C ++ প্রজেক্টে C ++ স্ট্রিমগুলি কী ধরণের সমস্যা তৈরি করতে পারে!
আরাক

9
@AraK। তারা খুব ধীর? তারা খুব বেশি কারণে বাইটস যুক্ত করে না। অরুণশাহ নিজের ব্যক্তিগত জ্ঞানের জন্য জানতে চান? ব্যক্তিগত পছন্দ (আমি স্ট্রডিওকে আমার কাছে প্রবাহিত করতে পছন্দ করি)। এখানে অনেক কারণ আছে.
কিটসুনওয়াইএমজি

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

1
@ ডোনাল: ট্যাগগুলি সি এবং সি ++ ছিল। আমি কোনওভাবেই সি +++ এর আই / ও স্ট্রিম স্টাফের পক্ষে পরামর্শ দিচ্ছি না (আমি এর কোনও অনুরাগী নই), কেবল এটি নির্দেশ করে যে প্রশ্নটি মূলত * "... কোনও স্পেসিফায়ারের জন্য স্পেসিফিকেশন জিজ্ঞাসা করবেন নাprintf ।"
টিজে ক্রাউডার


2

আরাক যেমন বলেছে, সি ++ স্ট্রিম ইন্টারফেস সর্বদা বহনযোগ্যভাবে কাজ করবে।

এসটিডি :: আকার_টি এস = 1024; std :: cout << s; // বা স্ট্রিংস্ট্রিমের মতো অন্য কোনও স্ট্রিম!

আপনি যদি সি স্টিডিও চান তবে "পোর্টেবল" এর নির্দিষ্ট কিছু ক্ষেত্রে এর কোনও বহনযোগ্য উত্তর নেই। এবং এটি কুৎসিত হয় যেহেতু আপনি দেখেছেন, ভুল ফর্ম্যাট পতাকাগুলি বাছাই করা একটি সংকলক সতর্কতা পেতে পারে বা ভুল আউটপুট দিতে পারে।

C99 "%" পিআরডিএমএক্স "\ n" এর মতো inttyype.h ফর্ম্যাটগুলির সাহায্যে এই সমস্যাটি সমাধান করার চেষ্টা করেছিল। তবে ঠিক "% zu" এর মতোই সবাই সি 99 সমর্থন করে না (2013 এর আগে এমএসভিএসের মতো)। এটি মোকাবেলায় "এমসিন্টটাইপস" ফাইলগুলি প্রায় ভাসমান রয়েছে।

যদি আপনি কোনও অন্য ধরণের কাস্ট করেন তবে পতাকাগুলির উপর নির্ভর করে আপনি কাটা কাটা চিহ্ন বা চিহ্ন পরিবর্তনের জন্য একটি সংকলক সতর্কতা পেতে পারেন। আপনি যদি এই রাস্তাটিতে যান তবে আরও বড় আকারের নির্দিষ্ট আকারের আকার চয়ন করুন pick স্বাক্ষরবিহীন দীর্ঘ লম্বা এবং "% llu" বা স্বাক্ষরযুক্ত "% lu" এর মধ্যে একটির কাজ করা উচিত, তবে llu একটি 32 বিট বিশ্বে খুব বেশি বড় হিসাবে জিনিসগুলিকে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে নামিয়ে আনতে পারে। (সম্পাদনা করুন -% লু,% llu এবং আকার_টি সব একই আকারের হলেও% llu এর সাথে মিলছে না এমন জন্য আমার ম্যাক 64৪ বিটের মধ্যে একটি সতর্কতা জারি করেছে And আপনার + মেলে এমন একটি ফর্ম্যাট ব্যবহার করতে হবে)

এই বিষয়টির জন্য, আপনি স্থির আকারের প্রকারের সাথে যেমন int64_t যেতে পারেন। কিন্তু অপেক্ষা করো! এখন আমরা c99 / c ++ 11 এ ফিরে এসেছি এবং পুরানো এমএসভিএস আবার ব্যর্থ। এছাড়াও আপনারও কাস্ট থাকে (যেমন মানচিত্র.সাইজ () কোনও নির্দিষ্ট আকারের আকার নয়)!

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

সুতরাং আপনি সি ++ স্ট্রিমস, শর্তসাপেক্ষ সংকলন, তৃতীয় পক্ষের ফ্রেমওয়ার্ক বা কোনও ধরণের পোর্টেবল যা আপনার জন্য কাজ করে।


-1

আপনি যদি 32-বিট স্বাক্ষরযুক্ত পূর্ণসংখ্যাকে% lu ফর্ম্যাটে পাস করেন তবে তা আপনাকে সতর্ক করবে? রূপান্তরটি সঠিকভাবে সংজ্ঞায়িত এবং কোনও তথ্য হারাতে না পারায় এটি ঠিক থাকতে হবে।

আমি শুনেছি যে কিছু প্ল্যাটফর্ম ম্যাক্রোগুলিকে সংজ্ঞায়িত করেছে <inttypes.h>যে আপনি আক্ষরিক বিন্যাসে .োকাতে পারেন তবে আমি আমার উইন্ডোজ সি ++ সংকলকটিতে শিরোনামটি দেখতে পাচ্ছি না, যা বোঝায় এটি ক্রস প্ল্যাটফর্ম নাও হতে পারে।


1
আপনি যদি ভুল আকারের কোনও কিছু প্রিন্টেফের মধ্যে পাস করেন তবে বেশিরভাগ সংকলক আপনাকে সতর্ক করবেন না। জিসিসি এর ব্যতিক্রম। সিটি 99 এর সাথে সংজ্ঞা দেওয়া হয়েছে সুতরাং যে কোনও সি সংকলক যে C99 অনুগত হবে এটি এতে থাকবে, এটি এখনই সমস্ত হওয়া উচিত। তবুও, আপনাকে একটি সংকলক পতাকা সহ সি 99 চালু করতে হতে পারে। যে কোনও ক্ষেত্রে, ইনটিটাইপস एच আকার_টি বা পিটিআরডিফ_টির জন্য একটি নির্দিষ্ট বিন্যাস সংজ্ঞায়িত করে না, যেহেতু যথাক্রমে তাদের 'z' এবং 't' এর নিজস্ব আকারের স্পেসিফায়ারগুলি পাওয়ার জন্য যথেষ্ট গুরুত্বপূর্ণ হওয়ার সিদ্ধান্ত নেওয়া হয়েছিল be
26-200

আপনি যদি ব্যবহার করেন তবে আপনার মানটি %luকাস্ট করা উচিত । এতে যুক্তিগুলির জন্য কোনও অন্তর্নিহিত রূপান্তর (প্রচার ব্যতীত) নেই । size_tunsigned longprintf
কিথ থম্পসন

-2

সি 99 তার জন্য "% জেডডি" ইত্যাদি সংজ্ঞায়িত করে। ( কমেন্টারদের ধন্যবাদ) এর জন্য সি ++ তে কোনও পোর্টেবল ফর্ম্যাট নির্দিষ্টকরণকারক নেই - আপনি ব্যবহার করতে পারেন %p, যা এই দুটি পরিস্থিতির মধ্যে শব্দটি পছন্দ করে তবে এটি কোনও পোর্টেবল পছন্দ নয় এবং হেক্সে মান দেয়।

বিকল্পভাবে, কিছু স্ট্রিমিং (যেমন স্ট্রিংস্ট্রিম) বা নিরাপদ মুদ্রণ প্রতিস্থাপন যেমন বুস্ট ফর্ম্যাট ব্যবহার করুন । আমি বুঝতে পারি যে এই পরামর্শটি কেবল সীমিত ব্যবহারের জন্য (এবং এর জন্য সি ++ প্রয়োজন)। (ইউনিকোড সমর্থন বাস্তবায়নের সময় আমরা আমাদের প্রয়োজনের জন্য উপযুক্ত অনুরূপ পদ্ধতির ব্যবহার করেছি))

সি এর মূল সমস্যাটি হ'ল এলিপিসিস ব্যবহার করে প্রিন্টফ ডিজাইনের মাধ্যমে অনিরাপদ - এটি প্রয়োজনীয় যুক্তি থেকে অতিরিক্ত যুক্তির আকার নির্ধারণ করা প্রয়োজন, সুতরাং "আপনি যা কিছু পেয়েছেন" সমর্থন করার জন্য এটি স্থির করা যায় না। সুতরাং যদি না আপনার সংকলক কিছু মালিকানাধীন এক্সটেনশন প্রয়োগ করে, আপনি ভাগ্য থেকে দূরে।


2
zআকার modidfier প্রমিত C, কিন্তু কিছু libc বাস্তবায়নের বিভিন্ন কারণের জন্য 1990 আটকে আছে (গ পক্ষে যেমন মাইক্রোসফট মূলত পরিত্যক্ত C ++ এবং - খুব সম্প্রতি - সি #)
ক্রিস্টোফ

3
C99 একটি আকার_t মানের আকার হতে আকার নির্দিষ্টকরণকারী 'z' এবং একটি ptrdiff_t মানের আকার হতে 't' সংজ্ঞায়িত করেছে।
26-200

2
%zdভুল, এটি স্বাক্ষরযুক্ত তাই এটি হওয়া উচিত %zu
ডেভিড কনরাড

-3

কিছু প্ল্যাটফর্মে এবং কিছু প্রকারের জন্য নির্দিষ্ট প্রিন্টফ রূপান্তর স্পেসিফায়ারগুলি উপলভ্য থাকে তবে কখনও কখনও বড় আকারে কাস্টিং অবলম্বন করতে হয়।

আমি এখানে এই জটিল সমস্যাটি নথিভুক্ত করেছি, উদাহরণস্বরূপ কোড সহ: http://www.pixelbeat.org/programming/gcc/int_tyype/ এবং পর্যায়ক্রমে নতুন প্ল্যাটফর্ম এবং প্রকারের তথ্যের সাথে আপডেট করে থাকি ।


1
নোট করুন যে কেবলমাত্র লিঙ্ক-উত্তরগুলি নিরুৎসাহিত করা হয়েছে, এসও উত্তরগুলি সমাধানের সন্ধানের শেষ পয়েন্ট হওয়া উচিত (বনাম। রেফারেন্সগুলির মধ্যে আরও একটি স্টপওভার, যা সময়ের সাথে সাথে বাসি হয়ে যায়)। রেফারেন্স হিসাবে লিঙ্কটি রেখে এখানে দয়া করে এখানে একা একা সংক্ষিপ্তসার বিবেচনা করুন।
ক্লিওপাত্রা

-5

আপনি যদি আকারের একটি মানকে স্ট্রিং হিসাবে মুদ্রণ করতে চান তবে আপনি এটি করতে পারেন:

char text[] = "Lets go fishing in stead of sitting on our but !!";
size_t line = 2337200120702199116;

/* on windows I64x or I64d others %lld or %llx if it works %zd or %zx */
printf("number: %I64d\n",*(size_t*)&text);
printf("text: %s\n",*(char(*)[])&line);

ফলাফল:

সংখ্যা: 2337200120702199116

পাঠ্য: আমাদের বসে বসে স্থির করে মাছ ধরতে দেওয়া যাক তবে !!

সম্পাদনা করুন: নীচের ভোটের কারণে প্রশ্নটি পুনরায় পড়া আমি উল্লেখ করেছি যে তার সমস্যাটি% llu বা% I64d নয় তবে বিভিন্ন মেশিনে আকার_t টাইপটি এই প্রশ্নটি দেখুন https://stackoverflow.com/a/918909/1755797
http: // www। cplusplus.com/reference/cstdio/printf/

সাইজ_টি 32 বিবিট মেশিনে স্বাক্ষরযুক্ত নয় এবং 64 বিট-তে স্বাক্ষরযুক্ত লম্বা লম্বা ইনট থাকলেও
% ll সর্বদা একটি স্বাক্ষরবিহীন দীর্ঘ দীর্ঘ অন্তর্বাসের প্রত্যাশা করে।

সাইজ_টি বিভিন্ন অপারেটিং সিস্টেমের দৈর্ঘ্যে পরিবর্তিত হয় এবং% llu একই থাকে


4
এটা কি বাজে কথা ?!
আন্টি হাপাল

সাইজের_টি পয়েন্টারের মাধ্যমে চর অ্যারির প্রথম 8 বাইটটি একটি স্বাক্ষরিত দীর্ঘ দীর্ঘ 64 বিটটিতে কাস্টিং এবং প্রিন্টএফ% I64d সহ তাদের সংখ্যা হিসাবে মুদ্রণ করা সত্যিই দর্শনীয় নয় আমি জানি, টাইপ ওভারফ্লো প্রতিরোধ করার জন্য আমি কোডে ছিলাম না তবে যে প্রশ্নের ক্ষেত্রের মধ্যে না।
আন্দ্রে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.