تبدیل اعداد منفی به باینری
قبل از توضیح این مطلب به قوانین جمع باینری اعداد توجه کنید:
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 می شوند؟ به شکل زیر توجه کنید:
در اصل 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 را می نویسیم. به شکل زیر توجه کنید:
تبدیل اعداد منفی به باینری
تبدیل اعداد منفی به باینری راحت نیست و کمی گیج کننده است. سی شارپ و دات نت از روش مکمل 2 (Two’s Complement Notation) برای این تبدیل استفاده می کنند. برای درک تبدیل اعداد منفی به باینری اجازه دهید که یک مثال بزنیم. در این مثال می خواهیم عدد 5- را به معادل باینری آن تبدیل کنیم. در مرحله اول ابتدا عدد 5- را به 5+ و سپس این عدد مثبت را به معادل باینری آن تبدیل می کنیم :
5 = 00000101
مقدار 5+ برابر 101 در سیستم دودویی است پس بقیه بیت های سمت چپ با عدد صفر پر شده اند. بعد از این تبدیل با استفاده از عملگر بیتی NOT ( ~ ) بیت ها را برعکس می کنیم :
~5 = 11111010
بعد از انجام این کار مقدار باینری 5~ را با عدد 1 به صورت زیر جمع می کنیم :
11111010 + 00000001 ----------- 11111011
نتیجه این جمع عدد 5- است. در نگاه اول ممکن است این سوال برایتان پیش بیاید که واقعا حاصل جمع بالا عدد 5- است؟ همانطور که گفتیم این تبدیل کمی گیج کننده است. اگر نتیجه بالا را با استفاده از تکنیک هایی که یاد گرفته اید به معادل دسیمال آن تبدیل کنید رقم 251 را به دست می آورید. اما سی شارپ و دات نت از اولین بیت سمت چپ برای تشخیص مثبت یا منفی بودن عدد استفاده می کند. اگر این بیت 1 باشد عدد منفی و اگر صفر باشد عدد مثبت است. پس باید به صورت زیر عمل جمع را انجام دهید :
به مثال دیگر توجه کنید. می خواهیم معادل باینری عدد 6- را به دست آوریم. ابتدا عدد 6 را به معادل باینری تبدیل می کنیم:
00000110
سپس بیت ها را معکوس می کنیم:
11111001
و در آخر با استفاده از قوانین جمع باینری که در ابتدای درس توضیح دادیم 6~ را با عدد 1 به صورت باینری جمع می کنیم:
11111001 + 00000001 ----------- 11111010
سپس نتیجه جمع بالا را، به عدد دسیمال تبدیل می کنیم. به شکل زیر توجه کنید:
حال اگر 6- را با 6 جمع کنیم حاصل 0 می شود :
00000110 + 11111010 ----------- 00000000
کد بالا را با استفاده از قوانینی که در ابتدای درس توضیح دادیم، با هم جمع کرده ایم. برای درک بهتر به شکل زیر توجه کنید:
نکته ای که در شکل بالا وجود دارد حاصل جمع اولین ستون سمت چپ است که باید عدد 10 باشد.از آنجایی که سیستم باینری باید با 8 بیت کار کند، تنها 8 رقم نخست برای ارائه پاسخ کافی خواهد بود و بیت آخر (بیت 9) را نادیده میگیریم. این بیت به نام بیت Overflow نامیده میشود. Overflow زمانی رخ میدهد که مجموع ستون سمت چپ، یک رقم اضافی تولید کند. این بیت اضافی Overflow را، میتوان به طور کامل نادیده گرفت
عدد منفی 2885 و 65/71 رو چگونه در کامپیوتر وارد کنیم
اعداد منفی در سیستم عدد باینری با استفاده از روش complement دوم بیان میشوند. برای محاسبه complement دوم یک عدد منفی، ابتدا باید اعداد آن را به صورت باینری بنویسیم، سپس بیتهای ۰ و ۱ را با هم جابجا کرده و سپس به تمامی بیتهای ۱ یکی اضافه کنیم.
حال برای تبدیل عدد منفی 2885- به باینری، ابتدا باید مقدار مطلق آن را به صورت باینری بنویسیم:
سپس بیتهای ۰ و ۱ را با هم جابجا میکنیم:
سپس به تمامی بیتهای ۱ یکی اضافه میکنیم:
بنابراین عدد منفی -2885 در سیستم باینری به صورت ۱۰۰۱۰۰۱۰۰۱۱ نمایش داده میشود.
برای تبدیل عدد منفی 65/71 به باینری، ابتدا باید مقدار مطلق آن را به صورت باینری بنویسیم:
سپس اعشار را به صورت باینری نیز بیان میکنیم:
سپس تمامی بیتهای ۰ و ۱ را با هم جابجا میکنیم:
سپس به تمامی بیتهای ۱ یکی اضافه میکنیم:
بنابراین عدد منفی -65/71 در سیستم باینری به صورت ۱۱۱۱۰۰۱۱۰۰۱۱۰۰۱۱۰۰۱۲ نمایش داده میشود. (توجه کنید که این عدد به دلیل وجود اعشار در سیستم باینری، باید به شکل معادلهای مانند زیر نمایش داده شود:
بنابراین عدد منفی -65/71 در سیستم باینری به صورت ۱۱۱۱۰۰۱۱۰۰۱۱۰۰۱۱۰۰۱۱۱۱۱۱۱۱ نمایش داده میشود. (توجه کنید که در این حالت، تعداد ارقام اعشاری باید تا حد کافی بزرگ باشد تا به دقت مورد نیاز رسیده شود.)
سلام منفی یک ر با همین روش دستی رفتم نتیجه اشتباه بم داد قضیش چیه؟
این روش برای بقیه اعداد درست کار میکنه ولی برای منفی یک نع
سلام
کجاش اشتباهه؟ چطور حساب کردین؟
حالا چرا 11111111 میشه 1- ؟
1 1 1 1 1 1 1 1 --------------------------------------------------------- -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1
با سلام خدمت شما
اگر بخوایم عددی مثل 6- رو به باینری تبدیل کنیم
عدد 6 بر مبنای باینری برابر هست با 00000110
و مکمل 1 عدد 6 برابر هست با 11111001
طبق گفته های شما باید مکمل قرینۀ عدد منفی رو به اضافۀ 1 بکنیم:
11111001+00000001 که برابر هست با 11111002 که مبنای دو نیست.
اگه میشه در مورد مرحله آخر مکمل 2 کمی توضیح بدید (مرحله به اضافه یک)
سلام، مطلب رو اصلاح کردم. یک بار دیگه از اول مطالعه بفرمایید
خیلی عالی بود مطالب سایت
ممنون
با سلام
من فکر میکنم این ساختاری که شما گفتین کامل نیست. برای تبدیل اعداد اینکه از چه نوعی به چه نوعی تبدیل بشن هم مهمه.
خیلی از اعداد هستن که با فرمولی که شما گفتین اصلا جور درنمیاد. مثلا عدد 326- اگر با نوع int باشه و بخوایم به نوع byte تبدیلش کنیم جوابش برابر با 186 میباشد. این در حالیه که اگر همین عدد رو به sbyte تبدیل کنیم جوابش میشه 70-
حالا همین عدد رو تو فرمول شما میزاری کلا یه جواب دیگه میاد.
من خیلی تو این زمینه حرف های نیستم اما جواب ها باهم نمیخونه. ممنون میشم اگه این موضوع گسترده تر هستش توضیح بدین و بگین چرا نتایج همین عدد در فرمول شما با چیزی که من در سی شارپ نوشتم متفاوته
سلام
اول از هرچیز بسیار ممنون بابت نظرتون. عرض شود که بنده الان مسافرت هستم و به محض برگشت، براتون کاملا روشن میکنم قضیه چیه. ولی قبلش شما این مطلب رو بخونید
http://www.w3-farsi.com
و همچنین این نکته رو مد نظر داشته باشین که قرار نیست مثلا اگه یه عدد منفی صحیح داریم اونو به نوع byte یا sbyte تبدیل کنیم. تو پست گفته شده که یه عدد منفی رو به ((باینری)) تبدیل کنیم. خواه این عدد منفی byte باشه یا int و یا sbyte… . ما که نگفتیم یه int داریم و اول به byte تبدیلش کنیم و بعد باینری.
البته جواب همین سوالاتتون رو هم تو لینک بالا میگیرین
سلام!
فوق العاده بود این عکس
واقعا یدونه عکس میتونه کار چند صفحه متن رو بکنه
ممنون
خیلی ممنونم. مطلب مفیدی بود.
سلام
بسیار بسیار عالی بود
دستتون درد نکند
سلام، مرسی