বিষয়বস্তুতে চলুন

প্রোগ্রামিংয়ের মৌলিক ধারণা/পূর্ণসংখ্যা ওভারফ্লো

উইকিবই থেকে

ওভারফ্লো

[সম্পাদনা]

ইনটিজার ওভারফ্লো তখন ঘটে যখন কোনো গাণিতিক অপারেশন এমন একটি মান তৈরি করার চেষ্টা করে, যা নির্দিষ্ট সংখ্যক বিটের মাধ্যমে উপস্থাপনযোগ্য সীমার বাইরে চলে যায় — অর্থাৎ, সর্বোচ্চ মানের চেয়ে বড় বা সর্বনিম্ন মানের চেয়ে ছোট হয়ে যায়।[1]

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

আলোচনা

[সম্পাদনা]

অনেক সময় ক্যারেক্টার (character) এবং পূর্ণসংখ্যা (integer) ডেটা টাইপকে একসাথে বিবেচনা করা হয়, কারণ তারা একইভাবে আচরণ করে (যাকে প্রায়ই ‘ইনটিজার পরিবার’ বা integer family বলা হয়)। বলা ভালো হবে যে, তারা ফ্লোটিং বিন্দু (floating-point) ডেটা টাইপের চেয়ে ভিন্নভাবে কাজ করে। ইনটিজার মানগুলি এক মান থেকে অন্য মানে লাফিয়ে যায়। ৬ এবং ৭-এর মাঝে যেমন কিছু নেই, ‘A’ এবং ‘B’-এর মাঝেও তেমন কিছু নেই। তাহলে প্রশ্ন উঠতে পারে—সব সংখ্যাকে ফ্লোটিং-পয়েন্ট ডেটা টাইপ করেই কেন ব্যবহার করা হয় না? এর পেছনে দুটি প্রধান কারণ রয়েছে। প্রথমত, বাস্তব জগতের কিছু জিনিস ভগ্নাংশ হয় না। একটি কুকুর, এমনকি মাত্র ৩টি পা থাকা সত্ত্বেও, একটি কুকুরই থাকে, তিন-চতুর্থাংশ কুকুর হয় না। দ্বিতীয়ত, প্রোগ্রামের নিয়ন্ত্রণে (যেমন লুপ গণনায়) প্রায়ই পূর্ণসংখ্যা (integer) ডেটা টাইপ ব্যবহার করা হয়। ইনটিজার পরিবারের একটি বৈশিষ্ট্য হলো — এটি বৃত্তাকারভাবে বা চক্রাকারে ঘুরে যায় (wrap-around)। দুই-বাইটের একটি ইনটিজার ব্যবহারের ক্ষেত্রে, ৩২,৭৬৭-এর পরের সংখ্যা হয় ঋণাত্মক ৩২,৭৬৮। (একইভাবে, ক্যারেক্টার টাইপেও ২৫৫-এর পরে আসে ০)। আমরা এটাকে উল্টেও বলতে পারি—ঋণাত্মক ৩২,৭৬৮-এর আগের সংখ্যা হলো ধনাত্মক ৩২,৭৬৭। এই ব্যাপারটা একটি সাধারণ গাণিতিক রেখা ব্যবহার করে বোঝানো যায়, যেখানে মানের সীমা নির্ধারণ করে রেখার দুই প্রান্তকে সংযুক্ত করলে একটি বৃত্ত তৈরি হয়।

ইনটিজার পরিবারের এই বৃত্তাকার বৈশিষ্ট্যটি (circular nature) ইনটিজার ও ক্যারেক্টার — দুই ধরনের ডেটা টাইপেই কাজ করে। তাত্ত্বিকভাবে এটি বুলিয়ান (Boolean) ডেটা টাইপের ক্ষেত্রেও প্রযোজ্য হওয়া উচিত; কিন্তু বাস্তবে বেশিরভাগ প্রোগ্রামিং ভাষায় বিভিন্ন প্রযুক্তিগত কারণে তা হয় না।

"গণিতে, মডুলার অ্যারিথমেটিক (যাকে কখনও কখনও ঘড়ির গণিতও বলা হয়) হলো একটি গণনা-পদ্ধতি, যেখানে পূর্ণসংখ্যাগুলো একটি নির্দিষ্ট মানে পৌঁছানোর পর আবার শুরু থেকে গণনা শুরু করে — এই নির্দিষ্ট মানটিকে বলা হয় ‘মডুলাস’ (modulus)।...

মডুলার অ্যারিথমেটিকের একটি পরিচিত ব্যবহার হলো ১২-ঘন্টার ঘড়ি, যেখানে দিনকে দুইটি ১২-ঘন্টা করে ভাগ করা হয়। ধরো এখন সময় ৭:০০, তাহলে ৮ ঘণ্টা পরে সময় হবে ৩:০০। সাধারণ যোগ করলে ৭ + ৮ = ১৫ হওয়া উচিত, কিন্তু এটা সঠিক নয় কারণ ঘড়ির সময় প্রতি ১২ ঘন্টা পর ‘wrap around’ করে; অর্থাৎ ‘১৫টা’ নামক কোনো সময় নেই। একইভাবে, যদি ঘড়ি ১২:০০ (দুপুর) থেকে শুরু হয় এবং ২১ ঘণ্টা অতিবাহিত হয়, তাহলে পরের দিনে সময় হবে ৯:০০, ৩৩:০০ নয়। কারণ ঘড়ির ঘণ্টা সংখ্যা ১২-এ পৌঁছালে আবার শুরু হয় — এটিই ১২-এর মডুলো (modulo 12) গণিত। ঘড়িতে সময় গণনা করা মডুলার অ্যারিথমেটিকের একটি উদাহরণ।"

ইন্টিজার ভাগের ক্ষেত্রে মডুলাস অপারেটরের ব্যবহার মডুলার অ্যারিথমেটিকের ধারণার সাথে সম্পর্কিত।

লুপ চালানোর সময় এর প্রভাব

[সম্পাদনা]

যদি কোনো প্রোগ্রামার একটি গণনা লুপ (counting loop) ভুলভাবে সেটআপ করে, সাধারণত তিন ধরনের সমস্যার মধ্যে একটি ঘটে:

  • অনন্ত লুপ (Infinite loop) – সাধারণত ঘটে যখন আপডেট অংশ (update attribute) মিস হয়।
  • লুপ কখনোই চালানো হয় না – সাধারণত ঘটে যখন শর্তে < বা > এর দিক ভুল থাকে, অর্থাৎ তুলনামূলক সম্পর্ক ঠিকমতো লেখা হয়নি।
  • লুপ প্রত্যাশার চাইতে বেশি বার চলে – সাধারণত ঘটে যখন আপডেট সঠিকভাবে হ্যান্ডেল করা হয়নি। অনেক সময় কাউন্টের দিক (বৃদ্ধি বা হ্রাস) পাল্টানো প্রয়োজন।

এবার আমরা একটি উদাহরণ দেব যেখানে লুপটি যেন অনন্তকাল চলে (তৃতীয় সমস্যাটি)।

 for int x = 0, x < 10, x--
     Output x

উপরের কোডে ভুলবশত x-এর মান কমানো হচ্ছে (decrement), যার ফলে x নেতিবাচক দিকে চলে যাচ্ছে -২,১৪৭,৪৮৩,৬৪৮ (যা সাধারণ চার-বাইটের সাইনড ইন্টিজারের সবচেয়ে বড় নেতিবাচক মান)। এটি নেতিবাচক দুই বিলিয়নের বেশি মানে পৌঁছাতে কিছু সময় নেবে (তাই লুপটি অনন্তকাল চলতে থাকে বলে মনে হতে পারে), এরপর শেষ পর্যন্ত x আবার ধীরে ধীরে ধনাত্মক ২,১৪৭,৪৮৩,৬৪৭-এ পৌঁছাবে। যেটি, অবশেষে, লুপের চলা বন্ধ করে দেবে।

মূল শব্দসমূহ

[সম্পাদনা]

বৃত্তাকার প্রকৃতি (Circular nature): পরিবারের ডেটা টাইপের ধনাত্মক ও ঋণাত্মক সীমা দুটোকে সংযুক্ত করার বৈশিষ্ট্য।

লুপ নিয়ন্ত্রণ (Loop control): লুপের সকল উপাদান (শর্ত, আপডেট ইত্যাদি) সঠিকভাবে পরিচালনা করা নিশ্চিত করা।

মডুলার গণিত (Modular arithmetic): এমন গণনার পদ্ধতি যেখানে পূর্ণসংখ্যাগুলো একটি নির্দিষ্ট মানের পরে আবার শুরু থেকে গণনা শুরু করে (সংখ্যাগুলো "wrap around" করে)।

তথ্যসূত্র

[সম্পাদনা]
  1. Wikipedia: Integer overflow