Int32, int, int32_t, int8 এবং int8_t এর মধ্যে পার্থক্য


109

আমি int32_tসম্প্রতি একটি সি প্রোগ্রামে ডেটা টাইপ জুড়ে এসেছি । আমি জানি যে এটা 32 বিট সঞ্চয় করে, কিন্তু না intএবং int32একই কাজ?

এছাড়াও, আমি charএকটি প্রোগ্রামে ব্যবহার করতে চাই । আমি কি int8_tপরিবর্তে ব্যবহার করতে পারি ? পার্থক্য কি?

সংক্ষিপ্তসার হিসাবে: সি এর মধ্যে int32, int, int32_t, int8 এবং int8_t এর মধ্যে পার্থক্য কী?

উত্তর:


127

মধ্যে int32এবং int32_t, (এবং একইভাবে মধ্যে int8এবং int8_t) পার্থক্য বেশ সহজ: সি মান সংজ্ঞায়িত int8_tএবং int32_tকিন্তু কিছু নামে সংজ্ঞায়িত না int8বা int32- আধুনিক (যদি তারা সব অস্তিত্ব) কিছু অন্যান্য হেডার বা লাইব্রেরি থেকে সম্ভবত (সম্ভবত যোগে চেয়েও পুরনো int8_tএবং int32_tC99 মধ্যে)।

সরল intঅন্যদের থেকে কিছুটা আলাদা। যেখানে int8_tএবং int32_tপ্রত্যেকের একটি নির্দিষ্ট আকার রয়েছে,int যে কোনও আকার> = 16 বিট হতে পারে। বিভিন্ন সময়ে, 16 বিট এবং 32 বিট উভয়ই যথাযথভাবে সাধারণ হয়েছে (এবং একটি 64-বিট বাস্তবায়নের জন্য এটি সম্ভবত 64 বিট হওয়া উচিত)।

অন্যদিকে int, সি এর প্রতিটি বাস্তবায়নে উপস্থিত থাকার গ্যারান্টিযুক্ত, কোথায় int8_tএবং int32_tনেই। এটি আপনার কাছে গুরুত্বপূর্ণ কিনা তা প্রশ্ন করা সম্ভবত উন্মুক্ত। আপনি যদি ছোট এমবেডেড সিস্টেম এবং / অথবা পুরানো সংকলকগুলিতে সি ব্যবহার করেন তবে এটি সমস্যা হতে পারে। আপনি যদি প্রাথমিকভাবে এটি ডেস্কটপ / সার্ভার মেশিনে একটি আধুনিক সংকলক সহ ব্যবহার করেন তবে সম্ভবত তা হবে না।

উফ - অংশটি মিস হয়ে গেল char। আপনি int8_tচরের পরিবর্তে ব্যবহার করতে চাইলে (এবং কেবলমাত্র যদি) আপনি কোনও পূর্ণসংখ্যার ধরণটি 8 মাপের বিট আকারের গ্যারান্টিযুক্ত চান। আপনি যদি অক্ষরগুলি সঞ্চয় করতে চান তবে আপনি সম্ভবত charপরিবর্তে ব্যবহার করতে চান । এর আকার পৃথক হতে পারে (বিটের সংখ্যার দিক থেকে) তবে এটি ঠিক এক বাইট হওয়ার গ্যারান্টিযুক্ত। যদিও একটি সামান্য বিজোড়তা: কোনও সমতল charস্বাক্ষরিত বা স্বাক্ষরবিহীন কিনা সে সম্পর্কে কোনও গ্যারান্টি নেই (এবং অনেক সংকলক একটি সংকলন-পতাকার পতাকার উপর নির্ভর করে এটি একটি তৈরি করতে পারে)। আপনি যদি তা স্বাক্ষরিত বা স্বাক্ষরিত না হওয়া নিশ্চিত করতে চান তবে আপনাকে তা স্পষ্ট করে উল্লেখ করতে হবে।


4
@ লিনাক্সফ্রাক: নিশ্চিত নন bool_t- এর আগে এর আগে কখনও শুনিনি। সি স্ট্যান্ডার্ডটি _Boolবিল্ট-ইন টাইপ হিসাবে সংজ্ঞায়িত করে । boolকেবলমাত্র যদি আপনি #include <stdbool.h>(ম্যাক্রো হিসাবে প্রসারিত হয় _Bool) হিসাবে সংজ্ঞায়িত হয় ।
জেরি কফিন 25'13

5
আপনি বলেছেন "64-বিট বাস্তবায়নের জন্য, (int) সম্ভবত b৪ বিট হওয়া উচিত"। অনুশীলনে, ইনট হ'ল উইন্ডোজ, ম্যাক ওএস এক্স, লিনাক্স এবং ইউনিক্সের বিভিন্ন স্বাদ সহ সমস্ত সাধারণ -৪-বিট প্ল্যাটফর্মগুলিতে 32-বিট। একটি ব্যতিক্রম ক্রে / ইউনিকস তবে সেগুলি আজকাল ফ্যাশনের বাইরে।
স্যাম ওয়াটকিন্স

6
@ সামওয়াটকিন্স: হ্যাঁ, তাই আমি সাবধানে বলেছিলাম "হওয়া উচিত", "নয়"। স্ট্যান্ডার্ডটি বলেছে এটি "আর্কিটেকচারের প্রস্তাবিত প্রাকৃতিক আকার", যার অর্থ (আইএমও) 64৪-বিট প্রসেসরের উপর নির্ভর করে, এটি সত্যই 64৪ বিট হওয়া উচিত (যদিও এটি আরও ভাল বা খারাপ, আপনি ঠিক ঠিক বলেছেন যে এটি সাধারণত নয়) টি)। আরো ব্যবহারিক দৃষ্টিকোণ থেকে, এটি হয় অতিশয় C89 ধরনের মধ্যে একটি 32 বিট টাইপ আছে কুশলী, এবং যদি int- এ 64 বিট দীর্ঘ, খুব বেশি, তাই প্রায়ই কোন 32 বিট হতে চাই অন্তত 64 বিট হতে হয়েছে প্রকার।
জেরি কফিন

4
@ বারলপ: হ্যাঁ (সি এবং সি উভয় উভয়ই চরের জন্য সর্বনিম্ন 255 মানের সীমা নির্ধারণ করে, সুতরাং এটির জন্য কমপক্ষে 8 বিট লাগবে, তবে আরও বেশি হতে পারে)।
জেরি কফিন 21

4
আমি সর্বদা এই ছাপে ছিলাম যে একটি বাইট হ'ল 8 বিট, 8 বিট আপ কোথাও নেই
এরলভোল্টন

19

_T ডেটা টাইপগুলি stdint.h শিরোনামে টাইপফের টাইপ হয়, যখন অন্তর্নির্মিত একটি অন্তর্নির্মিত মৌলিক ডেটা টাইপ হয়। এটি stdint.h উপস্থিত থাকলেই _t উপলব্ধ করে। অন্যদিকে int এর নিশ্চয়তা রয়েছে।


4
কেউ কেন _ টি ব্যবহার করবে?
দেভেন

@ ডেভেন আপনার কোডটি কোথাও কোথাও কাজ করে না এমন ঘটনা এড়াতে।
ফ্র্যাঙ্কলিন ইউ

3

সর্বদা মনে রাখবেন যে 'আকার' পরিবর্তনশীল যদি স্পষ্টভাবে নির্দিষ্ট না করে থাকে তবে যদি আপনি ঘোষণা করেন

 int i = 10;

কিছু সিস্টেমে এটি সংকলক দ্বারা 16-বিট পূর্ণসংখ্যার ফলাফল তৈরি করতে পারে এবং কিছু অন্যান্যতে এটি 32-বিট পূর্ণসংখ্যার (বা নতুন সিস্টেমে 64-বিট পূর্ণসংখ্যার) ফলাফল হতে পারে।

এম্বেডযুক্ত পরিবেশে এটি অদ্ভুত ফলাফলগুলিতে শেষ হতে পারে (বিশেষত মেমরি ম্যাপ করা I / O পরিচালনা করার সময় বা একটি সাধারণ অ্যারে পরিস্থিতি বিবেচনা করা যেতে পারে), সুতরাং এটি নির্দিষ্ট আকারের ভেরিয়েবলগুলি নির্দিষ্ট করার জন্য সুপারিশ করা হয়। লিগ্যাসি সিস্টেমগুলিতে আপনি জুড়ে আসতে পারেন

 typedef short INT16;
 typedef int INT32;
 typedef long INT64; 

সি 99 থেকে শুরু করে, ডিজাইনাররা stdint.h শিরোলেখ ফাইল যুক্ত করে যা মূলত একই ধরণের টাইপিডফগুলিকে উপকৃত করে।

উইন্ডোজ ভিত্তিক সিস্টেমে আপনি stdin.h শিরোলেখ ফাইলটিতে এন্ট্রি দেখতে পাবেন

 typedef signed char       int8_t;
 typedef signed short      int16_t;
 typedef signed int        int32_t;
 typedef unsigned char     uint8_t;

ন্যূনতম প্রস্থের পূর্ণসংখ্যা বা সঠিক প্রস্থের পূর্ণসংখ্যার ধরণের মতো আরও অনেক কিছু রয়েছে বলে আমি মনে করি আরও ভাল বোঝার জন্য stdint.h অন্বেষণ করা কোনও খারাপ জিনিস নয়।


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