আমি আমার কোড এবং এর উদ্দেশ্য আরও সুস্পষ্ট করতে স্বাক্ষরবিহীন ints ব্যবহার করি। স্বাক্ষরিত এবং স্বাক্ষরযুক্ত উভয় প্রকারের সাথে পাটিগণিত করার সময় অপ্রত্যাশিত অন্তর্নিহিত রূপান্তরগুলি থেকে রক্ষা করার জন্য আমি একটি জিনিস আমার স্বাক্ষরযুক্ত ভেরিয়েবলগুলির জন্য একটি স্বাক্ষরযুক্ত শর্ট (সাধারণত 2 বাইট) ব্যবহার করা। এটি কয়েকটি কারণে কার্যকর:
- যখন আপনি আপনার স্বাক্ষরযুক্ত স্বল্প ভেরিয়েবল এবং আক্ষরিক (যা টাইপ ইন্টের হয়) বা টাইপ ইন্টের ভেরিয়েবলগুলি দিয়ে পাটিগণিত করেন, এটি নিশ্চিত করে যে স্বাক্ষরযুক্ত ভেরিয়েবলটি সর্বদা সংক্ষিপ্তের চেয়ে উচ্চতর পদ থাকে । এটি স্বাক্ষরিত এবং স্বাক্ষরযুক্ত স্বাক্ষরযুক্ত ধরণের সাথে পাটিগণিতের কোনও অপ্রত্যাশিত আচরণ এড়িয়ে যায়, ধরে নিই অভিব্যক্তির ফলাফল অবশ্যই একটি স্বাক্ষরিত ইন্টারফেসের সাথে খাপ খায়।
- বেশিরভাগ সময়, আপনি স্বাক্ষরযুক্ত স্বাক্ষরযুক্ত ভেরিয়েবলগুলি স্বাক্ষরিত স্বাক্ষরযুক্ত 2-বাইট শর্টের সর্বোচ্চ মান অতিক্রম করবে না (65,535)
সাধারণ নীতিটি হ'ল স্বাক্ষরযুক্ত ভেরিয়েবলগুলির প্রকারটিতে স্বাক্ষরযুক্ত ভেরিয়েবলের প্রকারের চেয়ে স্বল্প র্যাঙ্ক থাকা উচিত যাতে স্বাক্ষরিত ধরণের পদোন্নতি নিশ্চিত করা যায়। তাহলে আপনার কোনও অপ্রত্যাশিত ওভারফ্লো আচরণ হবে না। অবশ্যই আপনি এটি সর্বদা নিশ্চিত করতে পারবেন না, তবে (বেশিরভাগ ক্ষেত্রে) এটি নিশ্চিত করা সম্ভব।
উদাহরণস্বরূপ, সম্প্রতি আমার কাছে এমন কিছু লুপের জন্য ছিল:
const unsigned short cuint = 5;
for(unsigned short i=0; i<10; ++i)
{
if((i-2)%cuint == 0)
{
//Do something
}
}
আক্ষরিক '2' টাইপ ইন্টের হয়। আমি যদি স্বাক্ষরবিহীন শর্টের পরিবর্তে স্বাক্ষরবিহীন অন্তর্ভুক্ত ছিলাম তবে উপ-এক্সপ্রেশনটিতে (আই -২), ২ কে স্বাক্ষরবিহীন ইনট হিসাবে উন্নীত করা হবে (যেহেতু স্বাক্ষরযুক্ত স্বাক্ষরের চেয়ে বেশি অগ্রাধিকার রয়েছে)। যদি i = 0 হয়, তবে উপ-এক্সপ্রেশন সমান (0u-2u) = অতিরিক্ত প্রবাহের কারণে কিছু বিশাল মান। আই = ১ নিয়ে একই ধারণা, তবে আমি যেহেতু স্বাক্ষরবিহীন সংক্ষিপ্ত, তাই এটি আক্ষরিক '2' এর মতো একই ধরণের হয়ে যায়, যা স্বাক্ষরযুক্ত এবং সমস্ত কিছুই ঠিকঠাক কাজ করে।
অতিরিক্ত সুরক্ষার জন্য: বিরল ক্ষেত্রে যেখানে আপনি যে আর্কিটেকচারটি প্রয়োগ করছেন তাতে 2 বাইট হওয়ার কারণ রয়েছে, এটি পাটিগণিতের এক্সপ্রেশনটিতে উভয় অপারেশনকে স্বাক্ষরযুক্ত ইনট হিসাবে উন্নীত করতে পারে যেখানে স্বাক্ষরযুক্ত স্বল্প ভেরিয়েবল ফিট না করে might স্বাক্ষরিত 2-বাইট ইন্টিতে, যার পরবর্তীটির সর্বাধিক মান 32,767 <65,535। ( আরও তথ্যের জন্য https://stackoverflow.com/questions/17832815/c-implicit-conversion-sided- স্বাক্ষরিত দেখুন )। এর থেকে রক্ষা পেতে আপনি কেবল আপনার প্রোগ্রামে একটি স্ট্যাটিক_সেসার্টটি নীচের মতো যুক্ত করতে পারেন:
static_assert(sizeof(int) == 4, "int must be 4 bytes");
এবং এটি আর্কিটেক্টগুলিতে সংকলন করবে না যেখানে int 2 বাইট রয়েছে।
for(unsigned int n = 10; n >= 0; n --)
(অসীম লুপগুলি)