تبدیل اعداد منفی به باینری

قبل از توضیح این مطلب به قوانین جمع باینری اعداد توجه کنید:

0 + 0 = 0
1 + 0 = 1
0 + 1 = 1
1 + 1 = 10
1 + 1 + 1 = 11

اما چرا 1 + 1 در ریاضی 2 و 1 + 1 + 1 برابر 3 ولی در سیستم باینری 10 و 11 می شوند؟ به شکل زیر توجه کنید:
converting-negative-numbers-to-binary-01
در اصل 1 + 1 همان 2 می شود که در سیستم باینری همین عدد بر 2 تقسیم می شود و اعداد 0 و 1 تولید می شوند و همین در مورد 1 + 1 + 1 نیز صدق می کند. با تقسیم عدد 3 بر 2 اعداد 1 و 1 تولید می شوند. به عدد تولید شده در خارج قسمت رقم نقلی می گویند که در ادامه درس کاربرد آن را متوجه می شوید. برای درک بهتر قوانین بالا به مثال زیر توجه کنید:

   110
+  111
-------
  1101

برای جمع دو عدد باینری کافی است بیت به بیت از سمت راست به چپ عمل جمع انجام شود. رقم نقلی حاصل از هر ستون در جمع ستون بعدی اعمال می شود. در کد بالا، از سمت راست به چپ، 0+1 که 1 می شود و آن را می نویسیم. 1+1 هم چون 10 می شود، عدد 0 را نوشته و 1 را به ستون بعد منتقل می کنیم. در ستون سوم از بالا به پایین 1+1 عدد 10 می شود که با 1 جمع کرده و عدد 11 را می نویسیم. به شکل زیر توجه کنید:
converting-negative-numbers-to-binary-02

تبدیل اعداد منفی به باینری

تبدیل اعداد منفی به باینری راحت نیست و کمی گیج کننده است. سی شارپ و دات نت از روش مکمل 2 (Two’s Complement Notation) برای این تبدیل استفاده می کنند. برای درک تبدیل اعداد منفی به باینری اجازه دهید که یک مثال بزنیم. در این مثال می خواهیم عدد 5- را به معادل باینری آن تبدیل کنیم. در مرحله اول ابتدا عدد 5- را به 5+ و سپس این عدد مثبت را به معادل باینری آن تبدیل می کنیم :

5 = 00000101

مقدار 5+ برابر 101 در سیستم دودویی است پس بقیه بیت های سمت چپ با عدد صفر پر شده اند. بعد از این تبدیل با استفاده از عملگر بیتی NOT ( ~ ) بیت ها را برعکس می کنیم :

~5 = 11111010

بعد از انجام این کار مقدار باینری 5~ را با عدد 1 به صورت زیر جمع می کنیم :

   11111010
+  00000001
-----------
   11111011

نتیجه این جمع عدد 5- است. در نگاه اول ممکن است این سوال برایتان پیش بیاید که واقعا حاصل جمع بالا عدد 5- است؟ همانطور که گفتیم این تبدیل کمی گیج کننده است. اگر نتیجه بالا را با استفاده از تکنیک هایی که یاد گرفته اید به معادل دسیمال آن تبدیل کنید رقم 251 را به دست می آورید. اما سی شارپ و دات نت از اولین بیت سمت چپ برای تشخیص مثبت یا منفی بودن عدد استفاده می کند. اگر این بیت 1 باشد عدد منفی و اگر صفر باشد عدد مثبت است. پس باید به صورت زیر عمل جمع را انجام دهید :
converting-negative-numbers-to-binary-03
به مثال دیگر توجه کنید. می خواهیم معادل باینری عدد 6- را به دست آوریم. ابتدا عدد 6 را به معادل باینری تبدیل می کنیم:

00000110

سپس بیت ها را معکوس می کنیم:

11111001

و در آخر با استفاده از قوانین جمع باینری که در ابتدای درس توضیح دادیم 6~ را با عدد 1 به صورت باینری جمع می کنیم:

   11111001
+  00000001
-----------
   11111010

سپس نتیجه جمع بالا را، به عدد دسیمال تبدیل می کنیم. به شکل زیر توجه کنید:
converting-negative-numbers-to-binary-04
حال اگر 6- را با 6 جمع کنیم حاصل 0 می شود :

   00000110
+  11111010
-----------
   00000000

کد بالا را با استفاده از قوانینی که در ابتدای درس توضیح دادیم، با هم جمع کرده ایم. برای درک بهتر به شکل زیر توجه کنید:
converting-negative-numbers-to-binary-05
نکته ای که در شکل بالا وجود دارد حاصل جمع اولین ستون سمت چپ است که باید عدد 10 باشد.از آنجایی که سیستم باینری باید با 8 بیت کار کند، تنها 8 رقم نخست برای ارائه پاسخ کافی خواهد بود و بیت آخر (بیت 9) را نادیده می‌گیریم. این بیت به نام بیت Overflow نامیده می‌شود. Overflow زمانی رخ می‌دهد که مجموع ستون سمت چپ، یک رقم اضافی تولید کند. این بیت اضافی Overflow را، می‌توان به طور کامل نادیده گرفت