এই পর্বে যা শিখবেন
- বাইনারি যোগ, বিয়োগ (borrow সহ), গুণ আর ভাগ — খাতায় করার পদ্ধতি
- ঋণাত্মক সংখ্যা লেখার তিন উপায়: sign-magnitude, 1's complement, 2's complement
- Complement দিয়ে বিয়োগ — end-around carry, শেষ carry বাদ দেওয়া, আর ঋণাত্মক ফল পড়া
- Overflow কখন হয়, কীভাবে ধরবেন, আর CPU-র flag কী কাজে লাগে
- HSC ICT আর চাকরির পরীক্ষার অঙ্ক কোন ধাঁচে আসে, আর AI-এর হিসাব কীভাবে যাচাই করবেন
১ · কম্পিউটার কীভাবে হিসাব করে — দুই অঙ্কের গণিত
পর্ব ১৬-তে দেখেছেন, কম্পিউটারের ভেতরে সব সংখ্যা লেখা হয় binary-তে — শুধু 0 আর 1 দিয়ে। কারণ একটি সুইচের দুটি অবস্থা সবচেয়ে নির্ভরযোগ্যভাবে চেনা যায়: বিদ্যুৎ আছে, অথবা নেই। কিন্তু শুধু লিখে রাখলে তো হবে না — কম্পিউটারের আসল কাজ হিসাব করা। bKash-এ টাকা পাঠালে ব্যালান্স থেকে বিয়োগ, মোবাইল রিচার্জ করলে যোগ, Excel-এ SUM — সব শেষ পর্যন্ত bit-এর যোগ-বিয়োগ।
সুখবর হলো, বাইনারি গণিত দশমিক গণিতের চেয়ে সহজ। স্কুলে নামতা মুখস্থ করতে হয়েছিল ১০০টি জোড়ার জন্য (০ থেকে ৯-এর সাথে ০ থেকে ৯)। বাইনারিতে অঙ্ক মাত্র দুটি, তাই যোগের নামতায় জোড়া মাত্র চারটি। পুরো পর্বটি এই চার নিয়মের ওপর দাঁড়িয়ে।
➕ নিয়ম এক: সহজ যোগ
কম্পিউটারের যোগ চলে স্কুলের মতো কলাম ধরে, ডান থেকে বাঁয়ে। ১-এর সাথে ১ যোগে দুই হয়, আর বাইনারিতে দুই লেখা হয় 10 — তাই সেখানে “হাতে ১” (carry) যায় পরের কলামে।
🔁 নিয়ম দুই: বিয়োগও যোগ
প্রকৌশলীরা একটি চমৎকার কৌশল বের করেছেন: ঋণাত্মক সংখ্যাকে এমনভাবে লেখা হয় যে যোগ করলেই বিয়োগ হয়ে যায়। এই লেখার নিয়মের নাম complement. ফলে CPU-তে আলাদা বিয়োগের যন্ত্র লাগে না।
A − B = A + (−B)📏 নিয়ম তিন: ঘরের মাপ নির্দিষ্ট
খাতায় যত খুশি অঙ্ক লেখা যায়, কিন্তু CPU-র register-এর মাপ বাঁধা — ৮, ১৬, ৩২ বা ৬৪ bit. ফল ঘরে না ধরলে বাড়তি অংশ হারিয়ে যায়। একে বলে overflow.
8-bit, 16-bit, 32-bit, 64-bitএই তিনটি ধারণাই HSC ICT-র তৃতীয় অধ্যায়ের গণিত অংশের মূল, আর চাকরির পরীক্ষার কম্পিউটার অংশেও বারবার আসে। কিন্তু শুধু পরীক্ষার জন্য নয় — বাইনারি গণিত বুঝলে বুঝবেন কেন একটি পুরোনো গেমে স্কোর হঠাৎ ঋণাত্মক হয়ে যায়, কেন একটি রকেট আকাশে ভেঙে পড়েছিল, আর কেন ২০৩৮ সালে কিছু পুরোনো যন্ত্রের ঘড়ি পিছিয়ে যেতে পারে।
বাইকের মিটারের মতো: একটি পুরোনো মোটরসাইকেলের দূরত্বের মিটারে পাঁচটি ঘর — 00000 থেকে 99999. 99999 কিলোমিটারের পর আরেক কিলোমিটার চালালে মিটার দেখায় 00000 — ছয় নম্বর অঙ্ক বসানোর জায়গাই নেই। আবার নতুন মিটার 00000 থেকে উল্টো দিকে এক ঘর ঘোরালে দেখাবে 99999 — যেন “−1”. কম্পিউটারের register ঠিক এমন একটি মিটার, শুধু অঙ্ক 0 আর 1. এই পর্বের overflow আর 2's complement, দুটোরই রহস্য এই ছবিতে লুকানো।
যোগের কাজটি করে CPU-র ভেতরের ALU, আর তার ভেতরে থাকে একটি adder সার্কিট। Adder কীভাবে logic gate দিয়ে বানানো হয়, তা দেখবেন পর্ব ২১-এ। এই পর্বে আমরা খাতা-কলমে সেই একই হিসাব করব — adder যা করে, আপনি হাতে তা-ই করবেন।
২ · বাইনারি যোগ — “হাতে ১” আর 1 + 1 + 1
প্রথমে চারটি মৌলিক নিয়ম। দুটি bit যোগ করলে ফল হয় দুই অংশে: একটি যোগফল bit (যা ওই কলামেই লেখা হয়) আর একটি carry (হাতে থাকা অঙ্ক, যা বাঁয়ের কলামে যায়)।
| যোগ | দশমিকে মানে | বাইনারি ফল | কলামে লিখুন | হাতে (carry) |
|---|---|---|---|---|
| 0 + 0 | ০ | 0 | 0 | 0 |
| 0 + 1 বা 1 + 0 | ১ | 1 | 1 | 0 |
| 1 + 1 | ২ | 10 | 0 | 1 |
| 1 + 1 + 1 (আগের carry সহ) | ৩ | 11 | 1 | 1 |
শেষ সারিটি খুব জরুরি, আর পরীক্ষায় সবচেয়ে বেশি আসে। কোনো কলামে দুটি 1 থাকলে, আর ডান দিক থেকে আরেকটি carry এলে, যোগ হয় তিনটি 1 — দশমিকে ৩, বাইনারিতে 11. অর্থাৎ কলামে লিখুন 1, হাতে 1. দশমিকে যেমন ৭ + ৮ = ১৫ হলে “৫ লিখি, হাতে ১”, ঠিক তেমন। দশমিকে হাতে যায় ১০ পূর্ণ হলে; বাইনারিতে ২ পূর্ণ হলেই।
এখন একটি পুরো যোগ: 1011 (দশমিকে ১১) আর 0111 (দশমিকে ৭)। খাতায় যেমন করেন — দুটি সংখ্যা ওপর-নিচে, ডান দিক থেকে শুরু। “পরের ধাপ” চেপে দেখুন প্রতিটি কলামে কী হয়:
1 A = 1 0 1 1 (11)2 B = + 0 1 1 1 (7)3কলাম ১: 1+1 = 10 → 0, হাতে 14কলাম ২: 1+1+1 = 11 → 1, হাতে 15কলাম ৩: 0+1+1 = 10 → 0, হাতে 16কলাম ৪: 1+0+1 = 10 → 0, হাতে 17শেষের হাতের 1 নামান → 10010
| হাতে (carry) | |
| যোগফল | |
| কলাম |
- সাজানো। দুটি সংখ্যা ওপর-নিচে লিখুন, ডান দিক মিলিয়ে। ছোট সংখ্যার বাঁয়ে 0 বসিয়ে দৈর্ঘ্য সমান করুন —
111-কে লিখুন0111. শুরুতে হাতে কিছু নেই (carry = 0). - ডানের প্রথম কলাম। 1 + 1 = 2, বাইনারিতে
10. কলামে লিখুন 0, হাতে 1 — ঠিক যেমন দশমিকে ১০ হলে “০ লিখি, হাতে ১”। - দ্বিতীয় কলাম — তিনটি 1. ওপরে 1, নিচে 1, আর হাতের 1. মোট ৩ =
11. লিখুন 1, হাতে 1. পরীক্ষার “1+1+1 = ?” প্রশ্নের উত্তর এটিই: 11. - তৃতীয় কলাম। ওপরে 0, নিচে 1, হাতে 1 — মোট ২ =
10. লিখুন 0, হাতে 1. - চতুর্থ কলাম। ওপরে 1, নিচে 0, হাতে 1 — আবার ২. লিখুন 0, হাতে 1. কলাম শেষ, কিন্তু হাতে এখনো 1 রয়ে গেছে।
- শেষ carry নামান। খাতায় হাতের 1 সবার বাঁয়ে বসে যায়: ফল
10010= ১৬ + ২ = ১৮. আর ১১ + ৭ = ১৮ — মিলে গেছে। খেয়াল করুন, ৪ bit-এর দুটি সংখ্যা যোগ করে ৫ bit-এর ফল এল। ৪ bit-এর ঘরে এই বাড়তি bit-এর জায়গা না থাকলে কী হয়, তা অংশ ৬-এ দেখবেন।
যেকোনো কলামে সর্বোচ্চ তিনটি 1 যোগ হতে পারে (দুটি সংখ্যার bit আর একটি carry), তাই প্রতিটি কলামের ফল 00, 01, 10 বা 11 — এর বাইরে কিছু নয়। এ কারণেই একটি ছোট, একই রকম সার্কিট (full adder) প্রতিটি কলামে বসিয়ে দিলেই যত বড় সংখ্যাই হোক যোগ করা যায়।
আরও দুটি উদাহরণ, আর তিনটি সংখ্যার যোগ
হাতে: 1 1 1 1 1 হাতে: 1 1 1 1
1 1 0 1 1 (27) 0 1 1 1 1 (15)
+ 0 1 1 0 1 (13) + 0 0 0 0 1 (1)
----------- -----------
1 0 1 0 0 0 (40) 1 0 0 0 0 (16)ডানের উদাহরণে দেখুন, একটি carry কীভাবে “ঢেউয়ের মতো” বাঁ দিকে গড়িয়ে যায় — 01111-এর সাথে 1 যোগ করলে প্রতিটি কলামে 1 + 1 হয়, প্রত্যেকে পরের জনকে carry দেয়। দশমিকে ৯৯৯ + ১ = ১০০০-এর মতোই। হার্ডওয়্যারে এই গড়িয়ে যাওয়াই ripple carry — বড় সংখ্যায় এটি সময় নেয়, পর্ব ২১-এ এর সমাধানও উঁকি দেবে।
তিনটি সংখ্যা একসাথে যোগ করতে হলে সবচেয়ে নিরাপদ পথ: প্রথম দুটি যোগ করুন, তারপর ফলের সাথে তৃতীয়টি। এক কলামে চারটি 1 এলে (যেমন 1+1+1+1 = ৪ = 100) carry একসাথে দুই কলাম দূরে যায় — হাতে হিসাব রাখা কঠিন, তাই পরীক্ষায় ধাপে ধাপে করাই ভালো।
৩ · বাইনারি বিয়োগ (borrow), গুণ আর ভাগ
সরাসরি বিয়োগ — “ধার করা”
বিয়োগেরও চারটি নিয়ম। ঝামেলা শুধু একটিতে: 0 থেকে 1 বিয়োগ। তখন বাঁয়ের কলাম থেকে ধার নিতে হয় — একে বলে borrow. দশমিকে বাঁয়ের ঘর থেকে ১ ধার আনলে এই ঘরে ১০ যোগ হয়; বাইনারিতে আসে ২ (অর্থাৎ 10), আর 10 − 1 = 1.
| বিয়োগ | ফল | ধার (borrow) |
|---|---|---|
| 0 − 0 | 0 | নেই |
| 1 − 0 | 1 | নেই |
| 1 − 1 | 0 | নেই |
| 0 − 1 | 1 | বাঁয়ের কলাম থেকে 1 ধার (10 − 1 = 1) |
1 0 1 0 (10) 1 0 0 0 0 (16) − 0 0 1 1 (3) − 0 0 0 0 1 (1) --------- ----------- 0 1 1 1 (7) 0 1 1 1 1 (15)
বাঁয়ের উদাহরণ, ডান দিক থেকে: প্রথম কলামে 0 − 1, তাই পাশের 1 থেকে ধার — ফল 1, আর পাশের কলামের 1 হয়ে গেল 0. দ্বিতীয় কলামে এখন 0 − 1, আবার ধার — তৃতীয় কলাম থেকে, যেখানে আছে 0; তাই ধার যায় আরও এক ঘর বাঁয়ে। ডানের উদাহরণে (১৬ − ১) ধারটি চারটি 0 পেরিয়ে সবার বাঁয়ের 1 থেকে আসে, আর পথের প্রতিটি 0 হয়ে যায় 1 — দশমিকে ১০০০০ − ১ = ৯৯৯৯-এর মতো।
সরাসরি বিয়োগের সমস্যা: ছোট সংখ্যা থেকে বড় সংখ্যা বিয়োগ (যেমন ৩ − ১০) করতে হলে আগে দেখতে হয় কোনটি বড়, তারপর উল্টো বিয়োগ করে সামনে “−” বসাতে হয়। মানুষের জন্য সহজ, কিন্তু হার্ডওয়্যারের জন্য বাড়তি তুলনা, বাড়তি সার্কিট। এই সমস্যার সমাধানই complement — অংশ ৪ আর ৫-এর বিষয়।
গুণ — সরানো আর যোগ করা (shift-and-add)
বাইনারি গুণের নামতা আরও ছোট: 0×0 = 0, 0×1 = 0, 1×0 = 0, 1×1 = 1. অর্থাৎ গুণকের প্রতিটি bit হয় 0 (তাহলে কিছু যোগ হয় না), নয়তো 1 (তাহলে গুণ্য সংখ্যাটি নিজেই, এক ঘর করে বাঁয়ে সরানো)। দশমিকে ১০ দিয়ে গুণ মানে শেষে একটি শূন্য বসানো; বাইনারিতে শেষে 0 বসানো মানে ২ দিয়ে গুণ। নিচে ১৩ × ৫:
1 1 0 1 (13)
× 1 0 1 (5)
---------
1 1 0 1 ← গুণকের ডানের bit 1: 1101 যেমন আছে
0 0 0 0 · ← মাঝের bit 0: সব শূন্য, এক ঘর সরানো
1 1 0 1 · · ← বাঁয়ের bit 1: 1101, দুই ঘর সরানো
-------------
1 0 0 0 0 0 1 (65) ✓ ১৩ × ৫ = ৬৫CPU-র ভেতরের সাধারণ গুণের পদ্ধতিও এই: shift (সরানো) আর add (যোগ)। আধুনিক CPU অনেকগুলো আংশিক যোগফল একসাথে যোগ করার বিশেষ সার্কিট দিয়ে কাজটি দ্রুত সারে, কিন্তু মূল ধারণা একই।
ভাগ — বারবার বিয়োগ
বাইনারি ভাগ দশমিকের লম্বা ভাগের (long division) মতো, শুধু সহজতর — প্রতিটি ধাপে ভাজক “যায়” (ভাগফলে 1) অথবা “যায় না” (ভাগফলে 0); অনুমান করার কিছু নেই। যেমন 1100 (১২) ÷ 100 (৪): প্রথম তিন অঙ্ক 110 থেকে 100 বিয়োগ করা যায় → ভাগফলে 1, ভাগশেষ 10; পরের অঙ্ক নামিয়ে 100 → আবার যায় → 1, ভাগশেষ 0. ভাগফল 11 = ৩ ✓. আর ২ দিয়ে ভাগ মানে ডান দিকে এক ঘর সরানো — দশমিকে ১০ দিয়ে ভাগের মতো।
৪ · ঋণাত্মক সংখ্যা — sign-magnitude, 1's আর 2's complement
কাগজে ঋণাত্মক সংখ্যা লিখতে সামনে “−” চিহ্ন বসাই। কিন্তু register-এ আছে শুধু 0 আর 1 — “−” রাখার আলাদা জায়গা নেই। তাই একটি bit-কেই চিহ্নের কাজে লাগাতে হয়। যে সংখ্যায় ধনাত্মক-ঋণাত্মক দুটোই রাখা যায়, তাকে বলে signed number; যেখানে শুধু ০ ও ধনাত্মক — unsigned. চিহ্নের কাজ করে সবার বাঁয়ের bit, যার নাম MSB (Most Significant Bit); আর সবার ডানের bit হলো LSB. ইতিহাসে তিনটি পদ্ধতি চালু হয়েছিল। নিচে ৮ bit ধরে দেখি।
পদ্ধতি ১: Sign-magnitude — চিহ্ন আর মান আলাদা
সবচেয়ে সহজ ভাবনা: MSB হবে চিহ্ন (0 = ধনাত্মক, 1 = ঋণাত্মক), বাকি ৭ bit সংখ্যার মান। তাই +5 = 0000 0101, −5 = 1000 0101. এই পদ্ধতির নাম sign-magnitude. পড়তে সহজ, কিন্তু দুটি বড় সমস্যা। এক, শূন্য দুটি: 0000 0000 (+0) আর 1000 0000 (−0). দুই, সাধারণ যোগ কাজ করে না — +5 আর −5 সরাসরি যোগ করলে আসে 1000 1010 = −10, অথচ উত্তর হওয়ার কথা ০. যোগের আগে চিহ্ন দেখে আলাদা নিয়ম চালাতে হয়।
পদ্ধতি ২: 1's complement — সব bit উল্টে দিন
ঋণাত্মক সংখ্যা পেতে ধনাত্মক রূপের প্রতিটি bit উল্টে দিন — 0 হবে 1, 1 হবে 0. এটিই 1's complement (এক-এর পরিপূরক)। +5 = 0000 0101 হলে −5 = 1111 1010. MSB এখানেও চিহ্ন বোঝায়। যোগ প্রায় কাজ করে — শুধু শেষ carry এলে সেটিকে ঘুরিয়ে আবার ডানে যোগ করতে হয় (end-around carry, অংশ ৫)। কিন্তু শূন্য এখনো দুটি: 0000 0000 (+0) আর 1111 1111 (−0).
পদ্ধতি ৩: 2's complement — উল্টে দিন, তারপর ১ যোগ
1's complement-এর সাথে 1 যোগ করলে পাওয়া যায় 2's complement (দুই-এর পরিপূরক)। −5 = 1111 1010 + 1 = 1111 1011. আজকের প্রায় সব কম্পিউটার, ফোন আর মাইক্রোকন্ট্রোলার ঋণাত্মক পূর্ণসংখ্যা এভাবেই রাখে। কারণ এতে শূন্য একটিই, আর সাধারণ যোগই কোনো বাড়তি নিয়ম ছাড়া সঠিক উত্তর দেয়।
| দশমিক | Sign-magnitude | 1's complement | 2's complement |
|---|---|---|---|
| +5 | 0000 0101 | 0000 0101 | 0000 0101 |
| −5 | 1000 0101 | 1111 1010 | 1111 1011 |
| +0 | 0000 0000 | 0000 0000 | 0000 0000 |
| −0 | 1000 0000 | 1111 1111 | নেই — শূন্য একটিই |
| −1 | 1000 0001 | 1111 1110 | 1111 1111 |
| সীমা (৮ bit) | −127 থেকে +127 | −127 থেকে +127 | −128 থেকে +127 |
| n bit-এর সীমা | −(2n−1−1) থেকে +(2n−1−1) | একই | −2n−1 থেকে +(2n−1−1) |
খেয়াল করুন: ধনাত্মক সংখ্যা তিন পদ্ধতিতেই হুবহু এক। পার্থক্য শুধু ঋণাত্মকে। আর 2's complement-এ −0-এর জায়গাটি খালি হয়নি — সেই bit-নকশা 1000 0000 পেয়েছে একটি বাড়তি সংখ্যা: −128. এ জন্যই 8-bit-এ ঋণাত্মক দিকে একটি সংখ্যা বেশি — −128 থেকে +127, মোট ২৫৬টি মান। ১৬ bit-এ সীমা −32,768 থেকে +32,767, আর ৩২ bit-এ −2,147,483,648 থেকে +2,147,483,647 — এই সংখ্যাটি অংশ ৮-এ আবার দেখবেন।
2's complement বের করার দুটি পথ
- পাঠ্যবইয়ের পথ: সংখ্যাটি নির্দিষ্ট bit-এ লিখুন → সব bit উল্টান (1's complement) → 1 যোগ করুন। −৬৫:
0100 0001→1011 1110→1011 1111. - দ্রুত পথ (shortcut): ডান দিক থেকে পড়ুন। প্রথম 1 পর্যন্ত (সেই 1 সহ) সব যেমন আছে লিখুন, তারপরের সব bit উল্টে দিন।
0100 0001-এ প্রথম 1 সবার ডানেই — সেটি রেখে বাকিগুলো উল্টালে1011 1111. একই উত্তর, অর্ধেক সময়ে। পরীক্ষায় উত্তর মিলিয়ে নিতে কাজে লাগে।
MSB কেন চিহ্ন — আর ঋণাত্মক সংখ্যার দশমিক মান
2's complement-এর সবচেয়ে সুন্দর ব্যাখ্যা: MSB-এর ওজন ঋণাত্মক। 8-bit-এ সাধারণত ঘরগুলোর ওজন ১২৮, ৬৪, ৩২, ১৬, ৮, ৪, ২, ১. 2's complement-এ বাঁয়ের ঘরের ওজন +১২৮ নয়, −১২৮. বাকিগুলো আগের মতো। তাহলে 1111 1011 = −১২৮ + ৬৪ + ৩২ + ১৬ + ৮ + ০ + ২ + ১ = −১২৮ + ১২৩ = −৫. বাকি সাত ঘর মিলে সর্বোচ্চ +১২৭ হতে পারে, যা ১২৮-এর চেয়ে ছোট — তাই MSB 1 হলেই পুরো সংখ্যা ঋণাত্মক। MSB আলাদা কোনো “চিহ্ন” নয়; সে নিজেই একটি ঋণাত্মক ওজনের অঙ্ক, আর সে কারণেই চিহ্নের কাজ করে।
অন্য পথ: পুরো bit-নকশাকে সাধারণ (unsigned) সংখ্যা হিসেবে পড়ে ২৫৬ বিয়োগ করুন — 1111 1011 = ২৫১, আর ২৫১ − ২৫৬ = −৫. আর তৃতীয় পথ, পাঠ্যবইয়ে যেটি বেশি দেখা যায়: MSB 1 দেখলে পুরো সংখ্যার আবার 2's complement নিন — 0000 0101 = ৫ — তারপর সামনে “−” বসান।
দেয়ালঘড়ির হিসাব: ঘড়িতে এখন ৯টা। ৫ ঘণ্টা পেছালে কয়টা? ৪টা। আবার ৭ ঘণ্টা এগোলেও ৪টা (৯ + ৭ = ১৬, অর্থাৎ ১২ পেরিয়ে ৪)। বারো ঘণ্টার ঘড়িতে “৫ পেছানো” আর “৭ এগোনো” একই কাজ, কারণ ৫ + ৭ = ১২. 8-bit register-এ ঘড়ির কাঁটা ঘোরে ২৫৬ ঘরে। তাই “৫ বিয়োগ” আর “২৫১ যোগ” একই — আর ২৫১-এর bit-নকশাই হলো 1111 1011, অর্থাৎ −5-এর 2's complement. এটিই পুরো কৌশলের রহস্য: 2's complement = 2n − সংখ্যা।
৫ · Complement দিয়ে বিয়োগ — যোগ করেই বিয়োগ
এবার আসল জাদু। A − B করতে হবে? B-এর 2's complement নিন (অর্থাৎ −B), তারপর A-এর সাথে যোগ করুন। ৮ bit পেরিয়ে নবম bit-এ কোনো carry এলে সেটি ফেলে দিন। কোনটি বড় তুলনা করার দরকার নেই, borrow-এর ঝামেলা নেই। নিচে ৯ − ৫, 8-bit-এ:
19 = 0000 1001, 5 = 0000 010125-এর bit উল্টাই → 1111 101031 যোগ → 1111 1011 (= −5)4 0000 10015+ 1111 10116= 1 0000 01007নবম bit বাদ → 0000 0100 = 4
| A (৯) | |
| B-এর রূপ | |
| যোগফল | |
| শেষ carry |
- সমান মাপে লিখুন। দুটি সংখ্যাই ৮ bit-এ: ৯ =
0000 1001, ৫ =0000 0101. সব সংখ্যা একই bit-এ না হলে complement-এর হিসাব ভুল হবে — পরীক্ষায় প্রশ্নে বলা bit সংখ্যা (সাধারণত ৮) মেনে চলুন। - 1's complement. বিয়োজ্য (B = ৫)-এর প্রতিটি bit উল্টান:
1111 1010. - +1 = 2's complement.
1111 1010+ 1 =1111 1011. এটিই 8-bit-এ −৫. (যাচাই: −১২৮ + ১২৩ = −৫ ✓) - যোগ করুন। সাধারণ বাইনারি যোগ, অংশ ২-এর মতো। ফল আসে ৯ bit:
1 0000 0100. বাঁয়ের বাড়তি 1-টি নবম bit — ৮ bit-এর register-এ এর জায়গা নেই। - শেষ carry বাদ। 2's complement পদ্ধতিতে নবম bit-এর carry সোজা ফেলে দিন। বাকি
0000 0100, MSB 0 — তাই ধনাত্মক, মান ৪. বাইকের মিটারের মতো: ঘড়ি ঘুরে আবার শুরুতে এসেছে, বাড়তি ঘোরার হিসাব রাখার দরকার নেই।
ফল যখন ঋণাত্মক — ৫ − ৯
এবার উল্টো: ৫ − ৯. −৯ = ৯ (0000 1001)-এর 2's complement = 1111 0111. যোগ: 0000 0101 + 1111 0111 = 1111 1100. এবার নবম bit-এ কোনো carry নেই, আর MSB 1 — অর্থাৎ ফল ঋণাত্মক, আর সংখ্যাটি নিজেই 2's complement রূপে আছে। মান জানতে আবার 2's complement নিন: 1111 1100 → উল্টে 0000 0011 → +1 → 0000 0100 = ৪. সুতরাং উত্তর −৪ ✓.
পরীক্ষার খাতায় লেখার ধাঁচ (2's complement পদ্ধতি): (১) দুটি সংখ্যা ৮ bit-এ লিখুন; (২) বিয়োজ্যর 1's complement লিখুন; (৩) +1 করে 2's complement দেখান; (৪) যোগটি কলাম সাজিয়ে লিখুন, carry ওপরে ছোট করে; (৫) নবম bit-এ carry এলে লিখুন “carry বাদ”, আর ফল ধনাত্মক; carry না এলে লিখুন “ফল ঋণাত্মক, 2's complement রূপে আছে” — তারপর আবার 2's complement নিয়ে “−” বসান; (৬) শেষে দশমিকে মিলিয়ে দেখান। এই শেষ লাইনটিই আপনার ভুল ধরার সবচেয়ে বড় অস্ত্র।
1's complement দিয়ে বিয়োগ — end-around carry
1's complement পদ্ধতিতেও যোগ করেই বিয়োগ, শুধু একটি পার্থক্য: নবম bit-এ carry এলে সেটি ফেলে দেওয়া হয় না, বরং ঘুরিয়ে এনে ফলের ডানের bit-এ যোগ করা হয়। একে বলে end-around carry. কেন? কারণ 1's complement-এ −B আসলে (2n − 1) − B, অর্থাৎ 2's complement-এর চেয়ে এক কম; সেই হারানো ১-টি ফেরত দেয় end-around carry. নিচে আবার ৯ − ৫:
- সংখ্যা
9 = 0000 10015 = 0000 0101 - 1's complement
1111 1010৫-এর bit উল্টানো - যোগ
1 0000 0011নবম bit-এ carry - End-around
0000 0100carry ডানে যোগ = 4
৯ = 0000 1001, ৫ = 0000 0101. এখনো কোনো হিসাব হয়নি।
৫-এর প্রতিটি bit উল্টে 1111 1010 — 1's complement-এ এটিই −৫. এখানে 1 যোগ করা হয় না।
0000 1001 + 1111 1010 = 1 0000 0011. নিচের ৮ bit-এ ৩ — উত্তর এক কম! নবম bit-এ একটি carry বেরিয়েছে।
নবম bit-এর 1 তুলে এনে ডানে যোগ: 0000 0011 + 1 = 0000 0100 = ৪ ✓. carry না এলে ফল ঋণাত্মক — তখন ফলের 1's complement নিয়ে সামনে “−” বসান।
- সমান মাপে লিখুন। আগের মতোই, দুটি সংখ্যা ৮ bit-এ।
- শুধু উল্টান। 1's complement-এ −৫ মানে ৫-এর সব bit উল্টানো, ব্যস — 1 যোগ নেই।
- যোগ করুন। ফল ৯ bit; নিচের ৮ bit সঠিক উত্তরের চেয়ে ঠিক ১ কম, কারণ 1's complement-এর −৫ আসল “২৫৬ − ৫”-এর চেয়ে ১ কম ছিল।
- End-around carry. নবম bit-এর carry ফেলে না দিয়ে ডানের bit-এ যোগ করুন — হারানো ১ ফেরত এল, উত্তর ৪. এই একটি বাড়তি যোগের জন্যই হার্ডওয়্যারে বাড়তি সময় লাগত — 2's complement জেতার একটি কারণ।
দুই পদ্ধতি পাশাপাশি মনে রাখুন: 1's complement → carry এলে ঘুরিয়ে যোগ; 2's complement → carry এলে বাদ। দুই ক্ষেত্রেই carry না এলে ফল ঋণাত্মক, আর মান পেতে সেই পদ্ধতিরই complement আবার নিতে হয়। AI চ্যাটবট আর অনেক শিক্ষার্থী ঠিক এখানেই গুলিয়ে ফেলে — দুই নিয়ম মিশিয়ে দেয়।
৬ · Overflow আর carry — ঘরে না ধরলে কী হয়
8-bit signed register-এ সর্বোচ্চ +127. এখন ১০০ + ৫০ = ১৫০ — যা ঘরে ধরে না। কম্পিউটার কি থেমে যায়? না। যোগের সার্কিট নিয়ম মেনে যোগ করে, আর ফল আসে একটি ভুল সংখ্যা। একে বলে overflow. নিচে দেখুন কী হয়:
1100 = 0110 0100 (MSB 0, ধনাত্মক)2 50 = 0011 0010 (MSB 0, ধনাত্মক)3যোগ = 1001 0110 (unsigned 150)4signed পড়া: −128 + 22 = −106 !5MSB-তে ঢোকা carry = 16MSB থেকে বেরোনো carry = 071 ≠ 0 → Overflow (V = 1)
| যোগফল | |
| signed মান | |
| carry in / out (MSB) | |
| Overflow flag |
- দুটি ধনাত্মক সংখ্যা। ১০০ আর ৫০, দুটির MSB-ই 0. দুটিই 8-bit signed-এর সীমার (+127) ভেতরে।
- সাধারণ যোগ। ফল
1001 0110— unsigned হিসেবে পড়লে ঠিক ১৫০. নবম bit-এ কোনো carry নেই; bit-গুলো সঠিকভাবেই যোগ হয়েছে। - কিন্তু signed হিসেবে পড়লে… MSB এখন 1 — অর্থাৎ ঋণাত্মক! −১২৮ + ১৬ + ৪ + ২ = −১০৬. দুটি ধনাত্মক যোগ করে ঋণাত্মক — অসম্ভব, অর্থাৎ ফল ঘরে ধরেনি। (১৫০ − ২৫৬ = −১০৬)
- MSB-এর দুই carry দেখুন। সপ্তম কলাম থেকে MSB-তে একটি carry ঢুকেছে (1), কিন্তু MSB থেকে নবম bit-এ কোনো carry বেরোয়নি (0).
- নিয়ম: ঢোকা ≠ বেরোনো → overflow. হার্ডওয়্যার ঠিক এই দুটি carry তুলনা করে (একটি XOR gate দিয়ে) overflow flag (V) 1 করে দেয়। প্রোগ্রাম চাইলে এটি দেখে সাবধান হতে পারে; না দেখলে −106 নিয়েই কাজ চলতে থাকে।
Carry আর overflow — এক জিনিস নয়
নবম bit-এ carry আসা মানেই ভুল নয়। ৯ + (−৫)-এ carry এসেছিল, অথচ উত্তর সঠিক। আসলে একই bit-নকশা দুই ভাবে পড়া যায়, আর দুই পড়ার জন্য দুই আলাদা সতর্কসংকেত:
| Carry (C) | Overflow (V) | |
|---|---|---|
| কাদের জন্য সতর্কসংকেত | Unsigned সংখ্যা (০ থেকে ২৫৫) | Signed সংখ্যা (−128 থেকে +127) |
| কখন 1 হয় | MSB থেকে নবম bit-এ carry বেরোলে | MSB-তে ঢোকা carry ≠ MSB থেকে বেরোনো carry |
| সহজ চেনার উপায় | Unsigned ফল ২৫৫ ছাড়িয়েছে | দুটি ধনাত্মকের যোগে ঋণাত্মক, বা দুটি ঋণাত্মকের যোগে ধনাত্মক |
| উদাহরণ: 100 + 50 | 0 (১৫০ unsigned-এ ঠিক আছে) | 1 (signed-এ −106, ভুল) |
| উদাহরণ: 9 + (−5) | 1 (unsigned-এ 9 + 251 = 260 ধরে না) | 0 (signed-এ 4, ঠিক) |
সহজ একটি সত্য মনে রাখুন: বিপরীত চিহ্নের দুটি সংখ্যা যোগ করলে কখনো overflow হয় না — ফল সবসময় দুটির মাঝামাঝি থাকে। Overflow শুধু একই চিহ্নের দুটি সংখ্যার যোগে সম্ভব।
CPU প্রতিটি হিসাবের পর কয়েকটি এক-bit সংকেত রাখে — একে বলে status flag: C (carry), V (overflow), Z (zero — ফল শূন্য কি না), আর S বা N (sign — ফলের MSB). প্রোগ্রাম এগুলো দেখে সিদ্ধান্ত নেয়; বিস্তারিত পর্ব ২৪-এ। নিচের ছোট JavaScript প্রোগ্রামটি একটি 8-bit ALU-র নকল — প্রতিটি কলাম আলাদা করে যোগ করে, আর চারটি flag দেখায়। “Run” চাপুন:
const b8 = n => (n & 255).toString(2).padStart(8, "0");
const sval = n => (n & 128) ? (n & 255) - 256 : (n & 255);
const twos = n => (~n + 1) & 255; // উল্টাও, তারপর +1
function alu(a, b, label) {
let carry = 0, cin7 = 0, out = 0, row = "";
for (let i = 0; i < 8; i++) { // ডান থেকে বাঁয়ে, এক কলাম করে
const s = ((a >> i) & 1) + ((b >> i) & 1) + carry;
if (i === 7) cin7 = carry; // MSB-তে ঢোকা carry
out |= (s & 1) << i;
carry = s >> 1;
row = carry + row;
}
console.log(label + "\n carry : " + row);
console.log(" ", b8(a), "+", b8(b), "=", b8(out));
console.log(" signed =", sval(out), "| C =", carry,
"V =", cin7 !== carry ? 1 : 0, "Z =", out === 0 ? 1 : 0, "S =", out >> 7);
}
console.log("2's complement of 5:", b8(5), "-> flip", b8(~5), "-> +1", b8(twos(5)));
alu(11, 7, "1) 11 + 7");
alu(9, twos(5), "2) 9 - 5 = 9 + (-5)");
alu(5, twos(9), "3) 5 - 9 = 5 + (-9)");
alu(100, 50, "4) 100 + 50 (signed 8-bit)");প্রথম লাইনে ৫-এর 2's complement: 00000101 → উল্টে 11111010 → +1 11111011. তারপর চারটি হিসাব। (১) ১১ + ৭ = 00010010 = ১৮, কোনো flag নেই। (২) ৯ + (−৫) = 00000100 = ৪, আর C = 1 — নবম bit-এর carry, যা 2's complement পদ্ধতিতে বাদ যায়; V = 0, তাই signed উত্তর সঠিক। (৩) ৫ + (−৯) = 11111100 = −৪; carry নেই, S = 1 — ফল ঋণাত্মক। (৪) ১০০ + ৫০ = 10010110, signed পড়লে −106, আর V = 1 — overflow ধরা পড়েছে। “carry” সারিটি প্রতিটি কলাম থেকে বাঁয়ে যাওয়া carry, বাঁয়ের অঙ্কটি নবম bit-এর carry. সংখ্যা বদলে নিজে চেষ্টা করুন — যেমন alu(127, 1, "...") বা alu(twos(100), twos(50), "...").
৭ · অক্টাল আর হেক্সাডেসিমাল যোগ — একই নিয়ম, অন্য সীমা
যোগের নিয়মটি আসলে সব সংখ্যা পদ্ধতিতে একই: কলামের যোগফল ভিত্তি (base) ছুঁলে বা ছাড়ালে ভিত্তি বিয়োগ করে লিখুন, হাতে ১. দশমিকে ভিত্তি ১০, বাইনারিতে ২, অক্টালে ৮, হেক্সাডেসিমালে ১৬. পর্ব ১৬-এর রূপান্তর জানা থাকলে এই অংশ খুব সহজ।
অক্টাল (ভিত্তি 8) হেক্সাডেসিমাল (ভিত্তি 16)
হাতে: 1 1 হাতে: 1 1
5 7 (৪৭) 9 A (১৫৪)
+ 2 6 (২২) + 7 C (১২৪)
----- -----
1 0 5 (৬৯) ✓ 1 1 6 (২৭৮) ✓
7 + 6 = 13 → 13 − 8 = 5, হাতে 1 A + C = 10 + 12 = 22 → 22 − 16 = 6, হাতে 1
5 + 2 + 1 = 8 → 8 − 8 = 0, হাতে 1 9 + 7 + 1 = 17 → 17 − 16 = 1, হাতে 1হেক্সে সবচেয়ে বেশি ভুল হয় অক্ষর-অঙ্কে — মনে রাখুন A = ১০, B = ১১, C = ১২, D = ১৩, E = ১৪, F = ১৫. কলামের যোগ ১০ থেকে ১৫-র মধ্যে হলে অক্ষরটি লিখুন (যেমন 7 + 8 = ১৫ = F), carry নেই। নিশ্চিত হতে চাইলে দুই সংখ্যাকে বাইনারিতে বদলে যোগ করে আবার হেক্সে ফিরুন — উত্তর একই আসবে। প্রোগ্রামাররা মেমরির ঠিকানা আর রঙের কোড (যেমন #1E90FF) নিয়ে কাজের সময় হেক্স যোগ-বিয়োগ প্রায়ই করেন।
পরীক্ষা ও ইন্টারভিউতে — HSC ICT, চাকরির পরীক্ষা (BCS, ব্যাংক, সরকারি চাকরি) আর ইন্টারভিউতে এ ধরনের প্রশ্ন প্রায়ই আসে:
- বাইনারিতে 1 + 1 + 1 = ?
11— লিখুন 1, হাতে 1. (আর 1 + 1 =10.) - 8-bit 2's complement-এ কোন সীমার সংখ্যা রাখা যায়? −128 থেকে +127; n bit-এ −2n−1 থেকে 2n−1 − 1.
- 8-bit-এ −৬৫-এর 2's complement নির্ণয় করুন। ৬৫ =
0100 0001→ 1's1011 1110→ 2's1011 1111. (সৃজনশীল প্রশ্নে ধাপগুলো দেখাতে হয়।) - কম্পিউটারে complement কেন ব্যবহার হয়? যোগের সার্কিট দিয়েই বিয়োগ করা যায় — আলাদা বিয়োজক সার্কিট লাগে না, আর 2's complement-এ শূন্য একটিই।
- যে পদ্ধতিতে শূন্যের দুটি রূপ থাকে? Sign-magnitude আর 1's complement (+0 আর −0); 2's complement-এ শূন্য একটিই।
৮ · বাস্তব জীবনে overflow — আর 2's complement কেন জিতল
Overflow শুধু পরীক্ষার অঙ্ক নয়। সফটওয়্যারের ইতিহাসে এটি বহুবার টাকা, সময় আর কখনো কখনো আস্ত যন্ত্র নষ্ট করেছে। তিনটি বিখ্যাত ঘটনা — বিস্তারিত ভাবনার প্রশ্নে।
🚀 Ariane 5, ১৯৯৬
ইউরোপের নতুন রকেটের প্রথম উড্ডয়ন। প্রায় ৩৭ সেকেন্ডের মাথায় একটি গতি-সংক্রান্ত মান 64-bit দশমিক-বিন্দুর সংখ্যা থেকে 16-bit signed পূর্ণসংখ্যায় বদলাতে গিয়ে ঘরে ধরল না। দিক-নির্ণয়ের কম্পিউটার বন্ধ হয়ে গেল, রকেট পথ হারিয়ে ধ্বংস হলো।
conversion overflow▶️ Gangnam Style, ২০১৪
YouTube-এর ভিউ কাউন্টার ছিল 32-bit signed — সর্বোচ্চ ২,১৪৭,৪৮৩,৬৪৭. PSY-এর গানটি সেই সীমার কাছে পৌঁছায়। YouTube ঘোষণা দেয়, তারা কাউন্টার 64-bit-এ বদলে নিয়েছে — সময়মতো বদলানোয় দর্শকেরা কোনো ভুল সংখ্যা দেখেননি।
32-bit → 64-bit⏰ ২০৩৮ সমস্যা (Y2K38)
অনেক পুরোনো সিস্টেম সময় রাখে “১ জানুয়ারি ১৯৭০ থেকে কত সেকেন্ড” হিসেবে, 32-bit signed সংখ্যায়। ২০৩৮ সালের ১৯ জানুয়ারি সেই গণনা সীমা ছাড়াবে; ঠিক না করা সিস্টেমের ঘড়ি লাফিয়ে ১৯০১ সালে চলে যেতে পারে।
signed 32-bit timeতিনটি গল্পের শিক্ষা একই: সংখ্যার ঘর বাছাইয়ের সময় ভাবুন, ভবিষ্যতে মান কত বড় হতে পারে। আর প্রোগ্রাম overflow হলে চুপচাপ ভুল চালিয়ে যাবে, নাকি থেমে সতর্ক করবে — সেটিও নকশার সিদ্ধান্ত।
2's complement কেন সবার পছন্দ হলো
- একটিই adder: যোগ আর বিয়োগ একই সার্কিটে। বিয়োগের জন্য শুধু B-এর bit উল্টে (NOT gate) প্রথম কলামে carry-in 1 দিলেই হয় — “উল্টাও, +1” হার্ডওয়্যারে প্রায় বিনা খরচে।
- একটিই শূন্য: “ফল শূন্য কি না” পরীক্ষা মানে সব bit 0 কি না — দুই রকম শূন্য সামলানোর ঝামেলা নেই।
- End-around carry নেই: শেষ carry ফেলে দিলেই চলে, বাড়তি দ্বিতীয় যোগ লাগে না।
- Signed আর unsigned-এর জন্য একই যোগ: bit-স্তরে যোগটি একই; শুধু ফল পড়ার নিয়ম আর দেখার flag আলাদা (C না V).
এ কারণে ১৯৬০-এর দশক থেকে ধীরে ধীরে প্রায় সব নতুন কম্পিউটার 2's complement বেছে নেয়, আর আজ C ভাষার সাম্প্রতিক মান (C23) আর C++20 signed পূর্ণসংখ্যার জন্য 2's complement বাধ্যতামূলক করেছে — অন্য পদ্ধতির যন্ত্র প্রায় আর নেই বললেই চলে।
আরও গভীরে: একই bit-নকশা signed না unsigned — সেটি ঠিক করে প্রোগ্রাম, হার্ডওয়্যার নয়। প্রোগ্রামিং ভাষাগুলো overflow-কে ভিন্নভাবে সামলায়: C-তে unsigned overflow ঘুরে শূন্যে আসে (নিয়মমাফিক), কিন্তু signed overflow “undefined behavior” — কম্পাইলার যা খুশি ধরে নিতে পারে; Java-তে int চুপচাপ ঘুরে যায়; Python-এর পূর্ণসংখ্যা প্রয়োজনমতো বড় হয়, তাই overflow-ই হয় না। Adder, subtractor, carry-lookahead আর signed সংখ্যার হার্ডওয়্যার বিস্তারিত দেখতে চাইলে ABCL TECH-এর Computer Architecture কোর্সের signed number পর্ব আর পুরো কোর্সটি দেখুন।
৯ · AI-এর যুগে — বাইনারি হিসাব যাচাই করুন
বাইনারি অঙ্কে AI চ্যাটবট খুব আত্মবিশ্বাসী ব্যাখ্যা দেয়, কিন্তু হিসাবে প্রায়ই ভুল করে — বিশেষ করে লম্বা bit-সারিতে, যেখানে একটি অঙ্ক এদিক-ওদিক হলেই পুরো উত্তর বদলে যায়। ভাষা মডেল অঙ্ক “হিসাব” করে না, অনেকটা “অনুমান” করে লেখে। তাই AI-কে শিক্ষক হিসেবে ব্যবহার করুন, কিন্তু উত্তর নিজে যাচাই করুন।
| AI-এর সাধারণ ভুল | কীভাবে ধরবেন |
|---|---|
| 1's complement-এ শেষ carry ফেলে দেওয়া, বা 2's complement-এ end-around carry যোগ করা | পদ্ধতির নাম দেখে নিয়ম মিলান; শেষে দশমিকে যাচাই করুন |
| bit সংখ্যা না মেনে complement নেওয়া (যেমন ৮ bit-এর বদলে ৪ বা ৬ bit) | প্রতিটি সংখ্যার bit গুনে দেখুন — সব একই মাপে কি না |
| Overflow হয়েছে, তবু “উত্তর −106” সঠিক বলে দেওয়া | একই চিহ্নের দুটি সংখ্যার যোগে ফলের চিহ্ন বদলেছে কি না দেখুন |
| নবম bit-এর carry দেখেই “overflow” বলা | Carry (unsigned) আর overflow (signed) আলাদা — MSB-এর ঢোকা-বেরোনো carry মিলিয়ে দেখুন |
ঋণাত্মক ফলের মান পড়তে ভুলে যাওয়া (11111100-কে ২৫২ বলা) | MSB 1 হলে আবার complement নিন, বা ২৫৬ বিয়োগ করুন |
নিচের prompt-টি কপি করে সংখ্যা বদলে ব্যবহার করুন। খেয়াল করুন, AI-কে প্রতিটি ধাপ আলাদা করে আর দশমিকে যাচাইসহ দেখাতে বলা হয়েছে — তাতে ভুল লুকানো কঠিন হয়:
AI-এর উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট
সবচেয়ে সহজ যাচাই: প্রতিটি বাইনারি সংখ্যাকে দশমিকে বদলে দেখুন (পর্ব ১৬-এর পদ্ধতিতে), হিসাবটি দশমিকে করুন, তারপর মিলান। এ পর্বের ALU প্রোগ্রামেও সংখ্যা বসিয়ে দেখতে পারেন — সেটি প্রতিটি কলাম সত্যিই হিসাব করে, অনুমান করে না।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন। ইতিহাসের এই গল্পগুলো দেখাবে, কয়েকটি bit-এর সিদ্ধান্ত কত বড় হতে পারে।
প্র ০১প্রথম দিকের কম্পিউটারগুলোতে তিন রকম পদ্ধতিই চলত। তাহলে 2's complement কীভাবে প্রায় সর্বজনীন হয়ে উঠল?
১৯৪০-৫০-এর দশকে কোনো মান ঠিক হয়নি, প্রতিটি নকশাকারী দল নিজের মতো বেছে নিত। ১৯৪৫ সালে John von Neumann তাঁর বিখ্যাত “First Draft of a Report on the EDVAC”-এ — যেখানে stored-program কম্পিউটারের ধারণা লেখা হয়েছিল (পর্ব ০২) — ঋণাত্মক সংখ্যার জন্য 2's complement ধাঁচের পদ্ধতি প্রস্তাব করেন। সেই প্রতিবেদনে অনুপ্রাণিত হয়ে ১৯৪৯ সালে কেমব্রিজের EDSAC 2's complement ব্যবহার করে।
কিন্তু সবাই একমত ছিল না। IBM-এর 700/7000 সিরিজের বৈজ্ঞানিক কম্পিউটারগুলো sign-magnitude ব্যবহার করত — মানুষের লেখার ধরনের সাথে মেলে, তাই প্রিন্ট করা সহজ। আবার DEC-এর PDP-1, UNIVAC 1100 সিরিজ আর Seymour Cray-এর নকশা করা বিখ্যাত সুপারকম্পিউটার CDC 6600 (১৯৬৪) চলত 1's complement-এ। 1's complement-এর আকর্ষণ ছিল এর সরলতা: ঋণাত্মক করতে শুধু bit উল্টাও, +1-এর জন্য আলাদা carry গড়ানোর অপেক্ষা নেই — দ্রুত মেশিনে এটি গুরুত্বপূর্ণ মনে হতো।
দাম দিতে হতো অন্য জায়গায়। 1's complement-এ শূন্য দুটি: সব 0 (+0) আর সব 1 (−0). কোনো হিসাবে −0 এলে “এটি কি শূন্য?” পরীক্ষায় দুটি নকশাই ধরতে হয়, নইলে দুটি সমান সংখ্যাকে অসমান মনে হতে পারে। প্রোগ্রামার আর কম্পাইলার-লেখকদের এই ফাঁদ নিয়ে সবসময় সতর্ক থাকতে হতো। আর end-around carry মানে যোগের পর সম্ভাব্য দ্বিতীয় একটি যোগ — হার্ডওয়্যারে বাড়তি সময় বা বাড়তি সার্কিট।
মোড় ঘোরে ১৯৬৪ সালে, যখন IBM তার System/360 পরিবার আনে 2's complement পূর্ণসংখ্যা দিয়ে। এই পরিবার বিশাল বাজার দখল করে আর পরের কম্পিউটারগুলোর আদর্শ হয়ে ওঠে। পরে DEC-এর PDP-11 (১৯৭০) আর তারপর মাইক্রোপ্রসেসরের যুগ — Intel 8080, x86, ARM — সবাই 2's complement বেছে নেয়। একটি adder দিয়ে যোগ-বিয়োগ, একটি শূন্য, আর signed-unsigned-এর জন্য একই যোগ — চিপ যত সস্তা আর দ্রুত হলো, এই সুবিধাগুলো তত স্পষ্ট হলো। শেষে ২০২০ সালের C++20 আর পরে C23 মান আনুষ্ঠানিকভাবে বলে দেয়, signed পূর্ণসংখ্যা 2's complement-ই হবে।
মূল উপলব্ধি: প্রযুক্তির মান সবসময় “সবচেয়ে সুন্দর” ধারণা থেকে আসে না — আসে খরচ, গতি আর বাজারের সম্মিলনে। 2's complement জিতেছে কারণ এটি হার্ডওয়্যারকে সরল করে আর প্রোগ্রামারকে ফাঁদ থেকে বাঁচায়; আর একটি বড় পরিবার (System/360) একবার বেছে নেওয়ায় বাকিরাও সেই পথে এসেছে।
প্র ০২১৯৯৬ সালে Ariane 5 রকেটের প্রথম উড্ডয়ন ৪০ সেকেন্ডের মধ্যে ধ্বংস হয়। “একটি সংখ্যা ঘরে ধরল না” — কীভাবে এত বড় দুর্ঘটনা ঘটায়?
৪ জুন ১৯৯৬, ফরাসি গায়ানার কুরু থেকে ইউরোপীয় মহাকাশ সংস্থার নতুন, বড় রকেট Ariane 5-এর প্রথম উড্ডয়ন (Flight 501). সাথে ছিল চারটি বৈজ্ঞানিক উপগ্রহ (Cluster মিশন)। উৎক্ষেপণের প্রায় ৩৭ সেকেন্ড পরে রকেটটি হঠাৎ পথ থেকে সরে যায়, প্রচণ্ড বাতাসের চাপে ভাঙতে শুরু করে, আর স্বয়ংক্রিয় ধ্বংস-ব্যবস্থা চালু হয়। ক্ষতি কয়েকশো মিলিয়ন ডলার, আর বহু বছরের বৈজ্ঞানিক কাজ।
তদন্ত কমিটি (গণিতবিদ Jacques-Louis Lions-এর নেতৃত্বে) কারণ খুঁজে পায় দিক-নির্ণয়ের যন্ত্র — Inertial Reference System (SRI)-এর সফটওয়্যারে। একটি অংশ রকেটের অনুভূমিক গতির সাথে সম্পর্কিত একটি মান (horizontal bias) 64-bit floating-point (দশমিক-বিন্দুর) সংখ্যা থেকে 16-bit signed পূর্ণসংখ্যায় বদলাত। 16-bit signed-এ সর্বোচ্চ +32,767. সফটওয়্যারটি পুরোনো Ariane 4 থেকে নেওয়া হয়েছিল, যেখানে মানটি কখনো এত বড় হতো না। কিন্তু Ariane 5 অনেক দ্রুত গতি নেয়; মান সীমা ছাড়াল, রূপান্তরে ত্রুটি (operand error) হলো।
এরপর একের পর এক দুর্ভাগ্য। কিছু রূপান্তরে সুরক্ষা-পরীক্ষা ছিল, কিন্তু এই চলকটিতে CPU-র কাজের চাপ কমাতে ইচ্ছা করেই রাখা হয়নি — Ariane 4-এর হিসাবে প্রয়োজন ছিল না বলে। ত্রুটি হলে যন্ত্রটি বন্ধ হয়ে যাবে — এমনই নকশা ছিল, কারণ ধরে নেওয়া হয়েছিল ত্রুটি মানে হার্ডওয়্যার নষ্ট। দ্বিতীয় (backup) SRI-ও একই সফটওয়্যার চালাত, তাই কয়েক মিলিসেকেন্ড আগে সেটিও একই কারণে বন্ধ হয়ে গিয়েছিল। মূল কম্পিউটার তখন SRI-র ত্রুটির diagnostic তথ্যকে উড্ডয়নের তথ্য ভেবে ইঞ্জিনের মুখ চরমভাবে ঘুরিয়ে দেয়। সবচেয়ে দুঃখের কথা: এই হিসাবটি উৎক্ষেপণের পর আর দরকারই ছিল না — শুধু উৎক্ষেপণের আগের প্রস্তুতির জন্য লাগত, কিন্তু কিছুক্ষণ চালু থাকত।
এটি ঠিক এই পর্বের overflow — বড় ঘরের সংখ্যা ছোট ঘরে ঢোকাতে গিয়ে ধরল না। পার্থক্য শুধু এই যে এখানে নীরবে ভুল সংখ্যা আসেনি, বরং ত্রুটি ধরা পড়েছিল — কিন্তু ত্রুটি সামলানোর নীতিই ভুল ছিল।
মূল উপলব্ধি: পুরোনো, “পরীক্ষিত” কোড নতুন পরিবেশে নিরাপদ নয় — আগের অনুমানগুলো (মান কত বড় হবে) নতুন করে যাচাই করতে হয়। আর একই সফটওয়্যারের দুটি কপি একই ভুল করবে; সত্যিকারের backup-এ ভিন্নতা লাগে।
প্র ০৩২০৩৮ সালের সমস্যা আর YouTube-এর Gangnam Style কাউন্টার — দুটিই 32-bit signed সংখ্যার সীমা। কেন একই সংখ্যা দুই জায়গায়, আর সমাধান কী?
32-bit signed 2's complement-এ সর্বোচ্চ মান 231 − 1 = ২,১৪৭,৪৮৩,৬৪৭ — দুইশো কোটির একটু বেশি। দশকের পর দশক এটিই ছিল প্রোগ্রামারদের “সাধারণ পূর্ণসংখ্যা” (C-র int), কারণ 32-bit CPU একবারে এই মাপ নিয়ে কাজ করত। তাই যেকোনো গণনা যেটি দুইশো কোটি ছাড়াতে পারে, সেখানে এই সীমা লুকিয়ে থাকে।
Gangnam Style (২০১৪): দক্ষিণ কোরিয়ার শিল্পী PSY-এর গানটি YouTube-এর প্রথম ভিডিও যার ভিউ এই সংখ্যার কাছে পৌঁছায়। ২০১৪ সালের ডিসেম্বরে YouTube মজা করে জানায়, তারা কখনো ভাবেনি কোনো ভিডিও 32-bit পূর্ণসংখ্যার চেয়ে বেশিবার দেখা হবে, তাই এখন কাউন্টার 64-bit-এ বদলেছে। 64-bit signed-এর সর্বোচ্চ প্রায় ৯২ হাজার কোটি কোটি (9.2 × 1018) — পৃথিবীর সব মানুষ হাজার বছর ধরে দিনরাত দেখলেও ফুরাবে না। পরিবর্তন সময়মতো হওয়ায় কাউন্টার ঋণাত্মক হয়নি। এটি সুপরিকল্পিত সমাধানের উদাহরণ, দুর্ঘটনার নয়।
২০৩৮ সমস্যা: Unix আর তার উত্তরসূরি অনেক সিস্টেম সময় রাখে “১ জানুয়ারি ১৯৭০, 00:00:00 UTC থেকে কত সেকেন্ড পেরোল” হিসেবে (Unix time). পুরোনো সিস্টেমে এটি ছিল 32-bit signed. ২০৩৮ সালের ১৯ জানুয়ারি 03:14:07 UTC-তে (বাংলাদেশ সময় সকাল ৯টা ১৪ মিনিট ৭ সেকেন্ড) গণনা পৌঁছাবে ২,১৪৭,৪৮৩,৬৪৭-এ। পরের সেকেন্ডে, 2's complement-এর নিয়মে, সংখ্যাটি ঘুরে হবে সবচেয়ে ছোট ঋণাত্মক মান — যা ১৯০১ সালের ১৩ ডিসেম্বর বোঝায়। ঠিক না করা সিস্টেমে মেয়াদ-হিসাব, সার্টিফিকেট যাচাই, সময়সূচি গোলমাল হতে পারে।
সমাধান সেই একই: 64-bit সময়। আধুনিক 64-bit অপারেটিং সিস্টেম আর বেশিরভাগ সফটওয়্যার আগেই বদলে গেছে, আর Linux-সহ বড় প্রকল্পগুলো 32-bit যন্ত্রের জন্যও 64-bit সময় যোগ করেছে। ঝুঁকি বেশি পুরোনো embedded যন্ত্রে — শিল্প-কারখানার নিয়ন্ত্রক, পুরোনো রাউটার, গাড়ির যন্ত্রাংশ — যেগুলো বহু বছর বদলানো হয় না। আর পুরোনো ফাইল-ফরম্যাট বা ডেটাবেসে 32-bit সময়ের ঘর থেকে গেলে নতুন সফটওয়্যারও বিপদে পড়তে পারে। Y2K-র মতোই, আগে থেকে কাজ করলে তেমন কিছুই ঘটবে না।
মূল উপলব্ধি: প্রতিটি নির্দিষ্ট মাপের সংখ্যা একটি “মেয়াদোত্তীর্ণের তারিখ” বহন করে। ভালো প্রকৌশলী ঘর বাছাইয়ের সময় জিজ্ঞেস করেন — এই মান সবচেয়ে বেশি কত বড় হতে পারে, আর কত বছর পরে?
প্র ০৪CPU প্রতিটি হিসাবের পর carry, overflow, zero আর sign flag রাখে। প্রোগ্রাম এগুলো আসলে কী কাজে লাগায়?
CPU-র ভেতরে একটি বিশেষ register থাকে (x86-এ FLAGS, ARM-এ NZCV নামে পরিচিত অংশ), যেখানে প্রায় প্রতিটি গাণিতিক কাজের পর কয়েকটি এক-bit সংকেত আপডেট হয়। x86-এ নামগুলো CF (carry), OF (overflow), ZF (zero), SF (sign); ARM-এ C, V, Z, N. এগুলো দেখতে ছোট, কিন্তু প্রোগ্রামের প্রায় প্রতিটি সিদ্ধান্ত এদের ওপর দাঁড়িয়ে।
১. তুলনা: if (a < b) লিখলে CPU আসলে a − b হিসাব করে (ফল কোথাও রাখে না), শুধু flag দেখে। ফল শূন্য হলে Z = 1 — অর্থাৎ a = b. Unsigned তুলনায় “a ছোট” মানে বিয়োগে borrow লেগেছে (x86-এ CF = 1). Signed তুলনায় শুধু sign দেখলে চলে না, কারণ overflow হলে sign উল্টে যায় — তাই নিয়ম হলো “S ≠ V হলে a ছোট”। একই bit, দুই তুলনা — signed আর unsigned-এর জন্য আলাদা লাফের নির্দেশ (x86-এ JL আর JB) থাকে এ জন্যই।
২. লুপ: একটি গণক প্রতিবার ১ কমে; শূন্য হলে Z = 1, আর লুপ থামে। বহু লুপ শেষ পর্যন্ত এই এক bit-এর ওপর নির্ভর করে।
৩. বড় সংখ্যার যোগ: 32-bit CPU-তে 64-bit যোগ করতে হলে প্রথমে নিচের ৩২ bit যোগ, তারপর ওপরের ৩২ bit যোগ — সাথে carry flag. x86-এ এর জন্য আলাদা নির্দেশ আছে: ADC (add with carry). ঠিক যেমন খাতায় এক কলামের হাতে-রাখা পরের কলামে যায়, এখানে এক “শব্দ” থেকে পরের শব্দে। এনক্রিপশনে (পর্ব ৪৪) শত শত bit-এর সংখ্যা এভাবেই যোগ হয়।
৪. নিরাপদ হিসাব: অনেক ভাষা আর লাইব্রেরি overflow flag দেখে “চেক করা” হিসাব দেয় — Java-র Math.addExact overflow হলে exception ছোড়ে, Rust ডিবাগ মোডে প্রোগ্রাম থামিয়ে দেয়, আর GCC/Clang-এর __builtin_add_overflow সরাসরি জানায় overflow হয়েছে কি না। ভেতরে এগুলো প্রায়ই CPU-র V বা C flag-ই পড়ে।
fetch-decode-execute চক্রে এই flag কোথায় বসে, আর শর্তযুক্ত লাফ (branch) কীভাবে কাজ করে, তা পর্ব ২৪-এ দেখবেন।
মূল উপলব্ধি: CPU-র “সিদ্ধান্ত নেওয়া” আসলে বিয়োগ করে কয়েকটি flag দেখা। যোগের সার্কিটের পাশে বসানো এই কয়েকটি bit-ই if, while, তুলনা আর বড় সংখ্যার হিসাব সম্ভব করে।
প্র ০৫Integer overflow-কে নিরাপত্তা-ঝুঁকি বলা হয় কেন? একটি ভুল হিসাব কীভাবে আক্রমণের দরজা খোলে, আর প্রোগ্রামাররা কীভাবে আটকান?
Overflow নিজে শুধু একটি ভুল সংখ্যা। বিপদ শুরু হয় যখন সেই ভুল সংখ্যা দিয়ে মেমরির মাপ ঠিক করা হয়। একটি সাধারণ ধরন: প্রোগ্রাম জানতে চায় কতটি জিনিস আসছে (n), প্রতিটির আকার কত (size), তারপর n × size বাইট মেমরি নেয়। যদি কেউ ইচ্ছা করে বিশাল n পাঠায়, গুণফল 32-bit-এ overflow হয়ে খুব ছোট সংখ্যা হয়ে যেতে পারে — যেমন কয়েকশো বাইট। প্রোগ্রাম ছোট একটি জায়গা নেয়, কিন্তু তারপর n-সংখ্যক জিনিস লিখতে থাকে — নিজের জায়গা পেরিয়ে পাশের মেমরিতে। একে বলে buffer overflow, আর এটি ঐতিহাসিকভাবে সবচেয়ে গুরুতর নিরাপত্তা-ত্রুটির একটি — প্রোগ্রাম crash থেকে শুরু করে গুরুতর ক্ষেত্রে আক্রমণকারীর কোড চালানো পর্যন্ত।
আরেকটি ধরন: signed-unsigned গুলিয়ে যাওয়া। “কত বাইট কপি করব” একটি signed সংখ্যায় −১ এলে, unsigned হিসেবে পড়লে সেটি বিশাল সংখ্যা (৩২ bit-এ প্রায় ৪২৯ কোটি)। সীমা-পরীক্ষা “−১ < ১০০” দেখে পাস করে দেয়, অথচ কপির ফাংশন বিশাল সংখ্যা ধরে কাজ করে। এই পর্বের মূল শিক্ষা — একই bit-নকশার দুই পড়া — এখানে সরাসরি নিরাপত্তার প্রশ্ন।
এ কারণেই MITRE-এর CWE তালিকায় “Integer Overflow or Wraparound” (CWE-190) আলাদা একটি দুর্বলতা হিসেবে আছে, আর সবচেয়ে বিপজ্জনক সফটওয়্যার-দুর্বলতার বার্ষিক তালিকায় নিয়মিত জায়গা পায়। ছবি, ভিডিও আর ফাইল-ফরম্যাট পড়ার কোডে এটি বেশি দেখা যায়, কারণ সেখানে ফাইলের ভেতরের সংখ্যা (যেমন ছবির প্রস্থ × উচ্চতা) দিয়ে মেমরির মাপ ঠিক হয় — আর ফাইল যে কেউ বানাতে পারে।
প্রতিরক্ষার উপায়গুলো সহজ নীতিতে দাঁড়িয়ে: (১) গুণ বা যোগের আগে পরীক্ষা করুন ফল সীমা ছাড়াবে কি না; (২) overflow-পরীক্ষাসহ ফাংশন বা ভাষার সুবিধা ব্যবহার করুন (যেমন আগের প্রশ্নের addExact বা compiler builtin); (৩) আকার-মাপের জন্য যথেষ্ট বড় আর unsigned ধরন ব্যবহার করুন, আর signed-unsigned মেশানো এড়ান; (৪) বাইরে থেকে আসা প্রতিটি সংখ্যাকে অবিশ্বাস করুন আর যাচাই করুন; (৫) Rust-এর মতো মেমরি-নিরাপদ ভাষা বা পরীক্ষার টুল (fuzzing, sanitizer) ব্যবহার করুন। সাইবার নিরাপত্তার সাধারণ দিক পর্ব ৪৩-এ দেখবেন।
মূল উপলব্ধি: নিরাপত্তার অনেক বড় সমস্যার শিকড় খুব ছোট — একটি সংখ্যা ঘরে ধরল না। নির্দিষ্ট মাপের ঘর, signed-unsigned আর overflow বোঝা তাই শুধু পরীক্ষার জ্ঞান নয়, নিরাপদ সফটওয়্যারের ভিত্তি।
অনুশীলন
খাতা-কলম নিন। প্রতিটি উত্তর শেষে দশমিকে মিলিয়ে দেখার অভ্যাস করুন — পরীক্ষায় এটিই আপনাকে বাঁচাবে।
-
যোগ আর সরাসরি বিয়োগ: (ক)
110101+101111(খ)11011−01110. দুটিই দশমিকে মিলিয়ে দেখান।(ক) ৫৩ + ৪৭. ডান থেকে: 1+1 = 10 (0, হাতে 1); 0+1+1 = 10 (0, হাতে 1); 1+1+1 = 11 (1, হাতে 1); 0+1+1 = 10 (0, হাতে 1); 1+0+1 = 10 (0, হাতে 1); 1+1+1 = 11 (1, হাতে 1); শেষের 1 নামান। ফল
1100100= ৬৪ + ৩২ + ৪ = ১০০ ✓.(খ) ২৭ − ১৪. ডান থেকে: 1 − 0 = 1; 1 − 1 = 0; 0 − 1 → বাঁয়ের 1 থেকে ধার, ফল 1 (বাঁয়ের ঘর 0 হলো); এখন 0 − 1 → আবার ধার, ফল 1; শেষ ঘরে 0 − 0 = 0. ফল
01101= ১৩ ✓. -
Complement রূপ: 8-bit-এ (ক) −৩৭ আর (খ) −১০০-এর 1's আর 2's complement লিখুন। (গ) 8-bit 2's complement সংখ্যা
1010 1010-এর দশমিক মান কত?(ক) ৩৭ =
0010 0101→ 1's:1101 1010→ 2's:1101 1011. যাচাই: −১২৮ + ৬৪ + ১৬ + ৮ + ২ + ১ = −৩৭ ✓.(খ) ১০০ =
0110 0100→ 1's:1001 1011→ 2's:1001 1100. Shortcut দিয়ে: ডান থেকে প্রথম 1 পর্যন্ত (100) রেখে বাকি উল্টালে একই উত্তর।(গ) MSB 1, তাই ঋণাত্মক। −১২৮ + ৩২ + ৮ + ২ = −৮৬. অথবা: unsigned ১৭০ − ২৫৬ = −৮৬. অথবা: 2's complement নিন →
0101 0110= ৮৬, তাই −৮৬. -
Complement দিয়ে বিয়োগ: ২০ − ৩৫ নির্ণয় করুন 8-bit-এ — প্রথমে 2's complement পদ্ধতিতে, তারপর 1's complement পদ্ধতিতে। দুই পদ্ধতিতে শেষ carry-র কী হলো?
২০ =
0001 0100, ৩৫ =0010 0011.2's complement: −৩৫ =
1101 1101. যোগ:0001 0100+1101 1101=1111 0001. নবম bit-এ carry নেই, MSB 1 → ফল ঋণাত্মক। 2's complement নিন:0000 1111= ১৫. উত্তর −১৫ ✓.1's complement: −৩৫ =
1101 1100. যোগ:0001 0100+1101 1100=1111 0000. carry নেই, তাই end-around carry-ও নেই; ফল ঋণাত্মক। 1's complement নিন:0000 1111= ১৫. উত্তর −১৫ ✓. দুই পদ্ধতিতেই শেষ carry আসেনি — ছোট থেকে বড় বিয়োগ করলে এমনই হয়। -
Overflow শিকার: 8-bit signed 2's complement-এ কোন যোগগুলোতে overflow হবে? (ক) ৬৪ + ৬৪ (খ) (−১০০) + (−৫০) (গ) ১২০ + (−২০) (ঘ) (−১২৮) + (−১). প্রতিটিতে নিয়মটি দিয়ে কারণ দেখান।
(ক) overflow.
0100 0000+0100 0000=1000 0000= −১২৮. দুটি ধনাত্মকের যোগে ঋণাত্মক; MSB-তে carry ঢুকেছে (1), বেরোয়নি (0).(খ) overflow.
1001 1100+1100 1110=1 0110 1010→ carry বাদে0110 1010= +১০৬. দুটি ঋণাত্মকের যোগে ধনাত্মক; MSB-তে ঢোকা carry 0, বেরোনো 1. (−১৫০ ৮ bit-এ ধরে না।)(গ) overflow নেই. বিপরীত চিহ্নের যোগ — কখনো overflow হয় না। ফল ১০০ =
0110 0100; নবম bit-এ carry এসেছে, কিন্তু সেটি বাদ যায়।(ঘ) overflow.
1000 0000+1111 1111=1 0111 1111→0111 1111= +১২৭. −১২৯ সীমার বাইরে।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রম2's complement পদ্ধতিতে A − B করার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- A আর B-কে একই সংখ্যক bit-এ (যেমন ৮ bit) বাইনারিতে লিখুন
- B-এর সব bit উল্টে দিন (1's complement)
- তার সাথে 1 যোগ করুন — এটিই −B
- A-এর সাথে −B যোগ করুন
- নবম bit-এ carry এলে সেটি বাদ দিন
- MSB 1 হলে ফলের 2's complement নিয়ে সামনে − বসান
বাইনারিতে 1 + 1 + 1 = কত?
- 10
- 3
- 11
- 111
8-bit 2's complement পদ্ধতিতে কোন সীমার পূর্ণসংখ্যা রাখা যায়?
- 0 থেকে 255
- −128 থেকে +127
- −127 থেকে +127
- −255 থেকে +255
8-bit-এ 0000 0110 (দশমিক ৬)-এর 2's complement কোনটি?
- 1111 1001
- 1000 0110
- 1111 1011
- 1111 1010
কম্পিউটারে ঋণাত্মক সংখ্যা complement পদ্ধতিতে রাখার প্রধান সুবিধা কী?
- একই adder সার্কিট দিয়ে যোগ আর বিয়োগ দুটোই করা যায়
- সংখ্যা রাখতে কম bit লাগে
- Overflow কখনো হয় না
- দশমিকে রূপান্তর আর লাগে না
8-bit signed 2's complement-এ 0111 1111 (+127) আর 0000 0001 (+1) যোগ করলে কী ঘটে?
- ফল +128, কোনো সমস্যা নেই
- নবম bit-এ carry আসে, ফল 0
- ফল −128, অর্থাৎ overflow হয়েছে
- কম্পিউটার যোগটি করতে অস্বীকার করে
1's complement পদ্ধতিতে বিয়োগ করার সময় যোগের পর নবম bit-এ carry এলে কী করতে হয়?
- carry বাদ দিতে হয়
- carry ঘুরিয়ে এনে ফলের সাথে যোগ করতে হয়
- ফলের 1's complement নিতে হয়
- overflow ঘোষণা করতে হয়
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- যোগ: 0+0 = 0, 0+1 = 1, 1+1 = 10, 1+1+1 = 11 — ডান থেকে বাঁয়ে, carry বাঁয়ের কলামে। বিয়োগে 0 − 1 হলে বাঁয়ের ঘর থেকে borrow.
- তিন পদ্ধতি: sign-magnitude (MSB চিহ্ন), 1's complement (bit উল্টানো), 2's complement (উল্টে +1). প্রথম দুটিতে শূন্য দুটি; 2's complement-এ একটি।
- 8-bit 2's complement-এর সীমা −128 থেকে +127; MSB-এর ওজন −128, তাই MSB 1 মানে ঋণাত্মক।
- Complement দিয়ে বিয়োগ: A + (−B). 2's-এ শেষ carry বাদ, 1's-এ ঘুরিয়ে যোগ (end-around); carry না এলে ফল ঋণাত্মক — আবার complement নিয়ে মান পড়ুন।
- Overflow: MSB-তে ঢোকা carry ≠ বেরোনো carry. একই চিহ্নের দুটি সংখ্যার যোগে ফলের চিহ্ন বদলালে overflow — Ariane 5, Y2K38-এর মূলে এটিই।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ১৮ · কোড — BCD, ASCII, Unicode আর প্যারিটিপরবর্তী পর্বঅক্ষর আর চিহ্ন কীভাবে বাইনারি কোড হয়।
- পর্ব ১৬ · সংখ্যা পদ্ধতি আর রূপান্তরআগের পর্ববাইনারি, অক্টাল, হেক্স আর দশমিকের মধ্যে রূপান্তর — এই পর্বের ভিত্তি।
- কম্পিউটার ফান্ডামেন্টালস ও ICT · কোর্স হোম৫৫টি পর্বপুরো কোর্সের রোডম্যাপ — কোন পর্ব কখন।
- Computer Architecture & Digital Logicগভীরে যানAdder, subtractor, signed সংখ্যা আর ALU-র নকশা বিস্তারিত।
- C প্রোগ্রামিংপাশের ট্র্যাকint, unsigned আর overflow — কোডে নিজে পরীক্ষা করে দেখুন।