সি-তে একটি পূর্ণসংখ্যা পরিবর্তনশীল 2 বাইট বা 4 বাইট দখল করে?
এটি আপনি যে প্ল্যাটফর্মটি ব্যবহার করছেন তার উপর নির্ভর করে পাশাপাশি আপনার সংকলকটি কীভাবে কনফিগার করা হয়েছে তা নির্ভর করে। একমাত্র অনুমোদিত উত্তরটি হ'ল sizeof
অপারেটরটি আপনার নির্দিষ্ট পরিস্থিতিতে কতটা পূর্ণসংখ্যার হয় তা দেখতে ব্যবহার করা।
এটি নির্ভর করে কিসের কারণগুলি?
বিন্যাস সেরা, বিবেচনা করা যেতে পারে বদলে আকার । অনুশীলনে উভয়ই পৃথক হবে, যদিও আকারের চেয়ে পরিমাপের পরিবর্তে ভেরিয়েবল প্রকারগুলি বেছে নেওয়াই অনেক বেশি বোকামি। এটাও লক্ষ করা গুরুত্বপূর্ণ যে মানটি আমাদের আকারের চেয়ে পরিসরের ভিত্তিতে আমাদের পূর্ণসংখ্যার ধরণের পছন্দগুলি বিবেচনা করতে উত্সাহিত করে , তবে আপাতত মানক অনুশীলনটিকে উপেক্ষা করুন এবং আমাদের কৌতূহলটি অন্বেষণ করা যাক , বাইটগুলি এবং এবং পূর্ণসংখ্যার উপস্থাপনা করা যাক ... আসুন আমরা কমিয়ে দেব খরগোশের গর্ত এবং এটি আমাদের জন্য দেখুন ...sizeof
CHAR_BIT
sizeof
, বাইট এবং CHAR_BIT
সি স্ট্যান্ডার্ড (উপরের সাথে সংযুক্ত) থেকে নেওয়া নিম্নলিখিত বিবৃতিটি এটিকে এমন কথায় বর্ণনা করে যা আমি মনে করি না যে এটির উন্নতি হতে পারে।
sizeof
অপারেটর তার প্রতীক এর আকার (বাইটে), যা একটি অভিব্যক্তি বা ধরনের আলাদা নাম হতে পারে উৎপাদ। আকারটি অপারেন্ডের ধরণ থেকে নির্ধারিত হয়।
একটি পরিষ্কার বোঝা ধরে নেওয়া আমাদের বাইটস সম্পর্কে আলোচনার দিকে পরিচালিত করবে । এটি সাধারণত অনুমান করা হয় যে একটি বাইট আট বিট হয়, যখন বাস্তবে CHAR_BIT
আপনাকে বলে যে বাইটে কত বিট রয়েছে । এটি কেবল সেই দুটি সূক্ষ্মতার মধ্যে একটি যা সাধারণ দুটি (বা চার) বাইট সংখ্যার কথা বলার সময় বিবেচনা করা হয় না ।
এখন পর্যন্ত জিনিসগুলি গুটিয়ে রাখা যাক:
sizeof
=> আকার বাইট, এবং
CHAR_BIT
=> বাইটে বিটের সংখ্যা
সুতরাং, আপনার সিস্টেম উপর নির্ভর করে, sizeof (unsigned int)
হতে পারে কোন তুলনায় মান বৃহত্তর শূন্য (শুধুমাত্র 2 বা 4), হিসাবে যদি CHAR_BIT
16 হয়, তাহলে একটি একক (ষোল-বিট) বাইট এটা যথেষ্ট বিট ষোল বিট পূর্ণসংখ্যা দ্বারা বর্ণিত প্রতিনিধিত্ব করতে হয়েছে মান (নীচে উদ্ধৃত) এটি প্রয়োজনীয়ভাবে দরকারী তথ্য নয়, তাই না? আসুন আরও গভীরভাবে ...
পূর্ণসংখ্যার উপস্থাপনা
সি মান নির্দিষ্ট করে সব মান পূর্ণসংখ্যা ধরনের (এবং ন্যূনতম স্পষ্টতা / ব্যাপ্তি CHAR_BIT
, খুব, fwiw) এখানে । এর থেকে, মানটি সংরক্ষণের জন্য কত বিট প্রয়োজন তার জন্য আমরা একটি ন্যূনতম অর্জন করতে পারি , তবে আমরা কেবলমাত্র রেঞ্জের উপর ভিত্তি করে আমাদের ভেরিয়েবলগুলি বেছে নিতে পারি । তবুও, এই উত্তরের জন্য প্রয়োজনীয় বিশদের একটি বিশাল অংশ এখানেই রয়েছে। উদাহরণস্বরূপ, নিম্নলিখিত যে স্ট্যান্ডার্ডটির জন্য (কমপক্ষে) ষোল বিট স্টোরেজ প্রয়োজন:unsigned int
UINT_MAX 65535 // 2¹⁶ - 1
সুতরাং আমরা দেখতে পাচ্ছি যে unsigned int
( কমপক্ষে ) ১ b বিট লাগবে , যেখানে আপনি দুটি বাইট পাবেন (ধরে নেওয়া CHAR_BIT
হয় 8) এবং পরে যখন এই সীমাটি বৃদ্ধি পেয়েছিল তখন 2³² - 1
লোকেরা তার পরিবর্তে 4 বাইট বানাচ্ছিল। এটি আপনি যে ঘটনাটি লক্ষ্য করেছেন তা ব্যাখ্যা করে:
বেশিরভাগ পাঠ্যপুস্তক বলে যে পূর্ণসংখ্যার ভেরিয়েবলগুলি 2 বাইট দখল করে। তবে আমি যখন একটি প্রোগ্রাম পরিচালনা করি যখন একটি পূর্ণসংখ্যার অ্যারের ক্রমাগত ঠিকানাগুলি মুদ্রণ করা হয় তখন এটি 4 এর পার্থক্য দেখায়।
আপনি একটি প্রাচীন পাঠ্যপুস্তক এবং সংকলক ব্যবহার করছেন যা আপনাকে অ-বহনযোগ্য সি শিখিয়ে দিচ্ছে; আপনার পাঠ্যপুস্তক রচয়িতা লেখক এমনকি সচেতন হতে পারে না CHAR_BIT
। আপনি উচিত আপনার পাঠ্যপুস্তক (এবং কম্পাইলার) আপগ্রেড এবং মনে রাখবেন যে এটা একটি সদা নব্য ক্ষেত্র আপনি থাকা দরকার যে আপ্রাণ চেষ্টা এগিয়ে প্রতিদ্বন্দ্বিতা ..., যদিও যে সম্পর্কে যথেষ্ট; আসুন দেখে নেওয়া যাক যে অন্তর্নিহিত পূর্ণসংখ্যার বাইট স্টোরগুলিতে অন্যান্য অ-বহনযোগ্য কী গোপনীয়তা রয়েছে ...
মান বিটগুলি সাধারণ ভুল ধারণাগুলি গণনা করা বলে মনে হয়। উপরের উদাহরণটিতে একটি unsigned
পূর্ণসংখ্যা টাইপ ব্যবহার করা হয় যার মধ্যে সাধারণত মূল্য মান বিট থাকে তাই বিশদে শয়তানটিকে মিস করা সহজ।
বিটগুলি সাইন করুন ... উপরের উদাহরণে আমি UINT_MAX
উপরের সীমা হিসাবে উদ্ধৃত করেছি unsigned int
কারণ এটি 16
মন্তব্য থেকে মানটি বের করা একটি তুচ্ছ উদাহরণ । স্বাক্ষরিত ধরণেরগুলির জন্য, ইতিবাচক এবং নেতিবাচক মানগুলির মধ্যে পার্থক্য করতে (এটিই সাইন), আমাদের সাইন বিটটিও অন্তর্ভুক্ত করতে হবে।
INT_MIN -32768 // -(2¹⁵)
INT_MAX +32767 // 2¹⁵ - 1
প্যাডিং বিটস ... যদিও পূর্ণাঙ্গের মধ্যে প্যাডিং বিট রয়েছে এমন কম্পিউটারগুলির মুখোমুখি হওয়া সাধারণ নয়, সি স্ট্যান্ডার্ড এটি ঘটতে দেয়; কিছু মেশিন (যেমন এটি একটি ) দুটি ছোট (স্বাক্ষরিত) পূর্ণসংখ্যা মানগুলি একত্রিত করে বৃহত্তর পূর্ণসংখ্যার প্রকারগুলি প্রয়োগ করে ... এবং আপনি যখন স্বাক্ষরিত পূর্ণসংখ্যাগুলি একত্রিত করেন, তখন আপনি একটি নষ্ট চিহ্নের বিট পান। সেই নষ্ট বিটটি সিতে প্যাডিং হিসাবে বিবেচনা করা হয় প্যাডিং বিটের অন্যান্য উদাহরণগুলিতে প্যারিটি বিট এবং ফাঁদ বিট অন্তর্ভুক্ত থাকতে পারে ।
যেমন আপনি দেখতে পাচ্ছেন, মানকটি পূর্ণসংখ্যার প্রকারগুলি বেছে নেওয়ার সময় মানদণ্ডের মতো INT_MIN
.. INT_MAX
এবং অন্যান্য ন্যূনতম / সর্বাধিক মানগুলি বিবেচনা করতে উত্সাহিত করে এবং মাপের উপর নির্ভর করে নিরুৎসাহিত করে কারণ অন্যান্য সূক্ষ্ম কারণগুলি যেমন ভুলে যাওয়ার সম্ভাবনা রয়েছে যেমন CHAR_BIT
বিড এবং প্যাডিং বিটগুলি এর মানকে প্রভাবিত করতে পারে sizeof (int)
(অর্থাত্ দ্বি-বাইট এবং চার-বাইট পূর্ণসংখ্যার সাধারণ ভুল ধারণা এই বিবরণগুলিকে অবহেলা করে)।