ওভ

ওভারফ্লো মধ্যে C#

১টি অনুশীলনী

ওভারফ্লো সম্পর্কে

এই অনুশীলনীটি দেখায়, বিভিন্ন সংখ্যাসূচক টাইপ ওভারফ্লো হলে তারা কী আচরণ করে, অর্থাৎ যখন কোনো গাণিতিক অপারেশন বা কাস্টের মতো হিসাবের ফলাফল ধারণ করার ক্ষমতা তাদের যথেষ্ট হয় না।

  • আনসাইনড ইন্টিজার (byte, ushort, uint, ulong) শূন্যে গিয়ে র‍্যাপ অ্যারাউন্ড করে (টাইপটির সর্বোচ্চ মান + ১ এখানে মডুলাস হিসেবে কাজ করে), যদি না সাধারণভাবে বলতে গেলে এগুলো checked ব্লকের ভেতরে থাকে; সেক্ষেত্রে OverflowException-এর একটি ইনস্ট্যান্স থ্রো করা হয়। int ও long একইভাবে আচরণ করবে, শুধু পার্থক্য এই যে তারা যথাক্রমে int.MinValue ও long.minValue-তে গিয়ে র‍্যাপ অ্যারাউন্ড করে।
int one = 1;
checked
{
    int expr = int.MaxValue + one;  // overflow exception is thrown
}

// or

int expr2 = checked(int.MaxValue + one);  // overflow exception is thrown
  • কোনো লিটারাল এক্সপ্রেশন যে ভ্যারিয়েবলে অ্যাসাইন করা হচ্ছে সেটিকে ওভারফ্লো করালে কম্পাইল-টাইম এরর হয়।
  • checked অবস্থা শুধু ব্লকের ভেতরে সরাসরি থাকা এক্সপ্রেশনগুলোর ক্ষেত্রেই প্রযোজ্য। কল করা ফাংশনে ঘটে যাওয়া ওভারফ্লো ধরা পড়ে না।
  • float ও double টাইপ ইনফিনিটি নামের একটি অবস্থায় চলে যায়, যা float.IsInfinity() ইত্যাদি দিয়ে পরীক্ষা করা যায়।
double d = double.MaxValue;
d *= 2d;
Double.IsFinite(d)
// => false
  • decimal টাইপের সংখ্যা OverflowException-এর একটি ইনস্ট্যান্স থ্রো করায়।
  • যে সব ক্ষেত্রে checked ব্লকের ভেতরে unchecked-এর প্রভাব উল্টে দিতে চান, বা যেখানে কম্পাইলার সেটিং ব্যবহার করা হয়েছে, সেসব ক্ষেত্রে এর জন্য একটি সংশ্লিষ্ট unchecked কিওয়ার্ড আছে।

কোনো এক্সেপশন থ্রো না করেই ঘটে যাওয়া ওভারফ্লো সমস্যার কারণ হতে পারে, কারণ সাধারণভাবে একটি এরর অবস্থা যত আগে রিপোর্ট করা যায় ততই ভালো।

int ও float-এর ওভারফ্লোজনিত সমস্যা কমানো যায় ফলাফলটি long, decimal বা double টাইপের একটি ভ্যারিয়েবলে অ্যাসাইন করে।

আপনার কোডে বড় ইন্টিজার অপরিহার্য হলে BigInteger টাইপ ব্যবহার করাও একটি বিকল্প।

স্বাভাবিকভাবেই এমন কিছু ক্ষেত্র আছে যেখানে একটি ইন্টিজারকে র‍্যাপ অ্যারাউন্ড করতে দেওয়া বৈধ, বিশেষত আনসাইনড মানের ক্ষেত্রে। এর একটি চিরচেনা উদাহরণ হলো হ্যাশ কোড, যেগুলো ইন্টিজারের প্রস্থকে একধরনের মডুলো হিসেবে ব্যবহার করে।

কোডবেসে সাধারণত দেখবেন, যেখানে uint বা ulong আইডেন্টিফায়ার হিসেবে ব্যবহার করা হয় সেখানে প্রায়ই কোনো চেক থাকে না, কারণ এটি করার ঝামেলা তার সুফলের চেয়ে বেশি বলে মনে করা হয়। ডোমেইন থেকেই স্পষ্ট যে খুব বড় কোনো মান আসবে না, এমন ক্ষেত্রেও একই কথা প্রযোজ্য। তবে সতর্কতামূলক একটি গল্পের জন্য এটি দেখুন।

GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি নতুন একটি উইন্ডো বা ট্যাবে খুলবে

ওভারফ্লো শিখুন