مسئله: تفریق بدون مدار تفریق
ساختن یک مدار جمعکننده آسان است، اما اگر برای تفریق هم مدار جدا بسازیم، سختافزار دو برابر میشود. راهحل هوشمندانه: تفریق را به جمع تبدیل کن. یعنی بهجای ، حساب کن . برای این کار باید «قرینهٔ» یک عدد دودویی را بلد باشی.
قرینهٔ یک عدد در یک مبنا، بهطوریکه جمع عدد با مکملش (با نادیدهگرفتن نقلی آخر) صفر شود. در مبنای ۲ دو مکمل داریم: مکمل یک و مکمل دو.
مکمل یک: معکوسکردن بیتها
مثلاً مکمل یک برابر است. ساده است، ولی یک ایراد دارد: دو نمایش برای صفر ( و ) و برای جمع باید نقلی آخر را دوباره اضافه کرد. به همین دلیل کامپیوترها عملاً از مکمل دو استفاده میکنند.
مکمل دو: معکوس کن و یکی اضافه کن
مثلاً مکمل دوی : اول معکوس کن ()، بعد یکی اضافه کن → .
اعداد علامتدار: بیت سمت چپ، تابلوی علامت است
در قرارداد مکمل دو برای اعداد علامتدار، پرارزشترین بیت، بیت علامت است: صفر یعنی مثبت، یک یعنی منفی. عدد منفی، مکمل دوی قدرمطلقش است.
بازهٔ نمایش با n بیت، از تا است (در ۸ بیت: ۱۲۸− تا ۱۲۷+).
اشتباه رایج
بیت علامت را جدا کن و بقیه همان قدرمطلق است؛ مثلاً در مکمل دو، ۱۰۱۱۱ یعنی منفیِ ۷.
تصحیح
این توصیفِ روش «علامت–مقدار» است، نه مکمل دو. در مکمل دو، ۱۰۱۱۱ یعنی مکمل دوی ۰۱۰۰۱، یعنی منفی ۹. برای به دست آوردن قدرمطلق یک عدد منفی در مکمل دو، باید دوباره مکمل دو بگیری.
تفریق با جمع — و تشخیص سرریز
تفریق یعنی ؛ نقلیِ بیرونافتاده از سمت چپ را نادیده بگیر. مثال: در ۴ بیت: ← نقلی آخر را دور بینداز → یعنی ۲. درست شد.
وقتی نتیجهٔ واقعی در بازهٔ قابلنمایش با تعداد بیت موجود جا نشود. قانون تشخیص: اگر نقلیِ ورودی به بیت علامت با نقلیِ خروجی از آن فرق کند، سرریز رخ داده است.
شهودش ساده است: جمع دو عدد مثبت نباید منفی شود و جمع دو منفی نباید مثبت شود. مثلاً (۷+۱ در ۴ بیت) میشود که خوانده میشود ۸−؛ نتیجه غلط است، چون ۸ در بازهٔ ۴ بیتی (تا ۷+) جا نمیشود.
خودت امتحان کن: مکملها زنده
عدد ۹ را در آزمایشگاه ببین: مکمل یک و دوی آن را بخوان و حالت «مکمل دو» را فعال کن تا تفسیر علامتدارش را ببینی. بعد عدد را عوض کن و قانون «معکوس کن و یکی اضافه کن» را راستیآزمایی کن.
- دودویی (۸ بیت)
- 00001001
- هگز / مبنای هشت
- 09 / 011
- مکمل یک / مکمل دو
- 11110110 / 00001010
- تفسیر علامتدار (مکمل دو)
- ۹
00001001 در حالت مکمل دو یعنی ۹؛ مکمل دوی آن 00001010 است.