محاسبات در مکمل2
ويژگي مهم نمايش مکمل2 سادگي پياده سازي عمليات محاسباتي است.
جمع
تفريق
ضرب و تقسيم
جمع
يکی از دلايلی که روش مکمل2 برای ذخيره اعداد صحيح علامتدار متداول است راحتی
پياده سازی عمليات جمع و تفريق در سخت افزار است. مزيت روش مکمل2 اين
است که قوائد جمع و تفريق برای اعداد علامتدار دقيقا مشابه يکديگر
هستند
جمع دو عدد مکمل2 به سادگی مانند جمع دو عدد باينری بدون علامت صورت
می گيرد. وقتی عمل جمع در مکمل2 انجام می شود سمت چپ ترين بيت ممکن
است يک رقم نقلی توليد کند. اين رقم نقلی استفاده نمی شود. بخاطر داشته
باشيد که کليه داده ها در کامپيوتر دارای اندازه ثابتی هستند. جمع
دو بايت هميشه يک بايت را می دهد( به همين ترتيب از جمع دو کلمه يک
کلمه حاصل می شود). اين خاصيت در نمايش مکمل دو مهم است.
مثال1.
ِDecimal | |
Hex | |
111 |
+2567 | |
0A07 | |
0000 1010 0000 0111 |
+ 467 | |
+ 01D3 | |
+ 0000 0001 1101 0011 |
3034 | |
0BDA | |
0000 1011 1101 1010 |
مثال2.
Decimal | |
Hex | |
1 1111 11 |
+518 | |
0206 | |
0000 0010 0000 0110 |
+(-80) | |
+ FFB0 | |
+ 1111 1111 1011 0000 |
438 | |
c 01B6 | |
c 0000 0001 1011 0110 |
مثال3.
Decimal | |
Hex | |
1 1111 1111 11 11 |
-25 | |
FFE7 | |
1111 1111 1110 0111 |
+(-10) | |
+ FFF6 | |
+ 1111 1111 1111 0110 |
-35 | |
c FFDD | |
c 1111 1111 1101 1101 |
مثال4.
Decimal | |
Hex | |
1 1111 11 |
+18495 | |
483F | |
0100 1000 0011 1111 |
+ 25690 | |
+ 645A | |
+ 0110 0100 0101 1010 |
44185 | |
AC99 | |
1010 1100 1001 1001 |
مثال5.
Decimal | |
Hex | |
1 1 11 111 |
-5633 | |
E9FF | |
1110 1001 1111 1111 |
+ (-29456) | |
+ 8CF0 | |
+ 1000 1100 1111 0000 |
-35089 | |
c 76EF | |
c 0111 0110 1110 1111 |
c نشان دهنده رقم نقلی است که در نتيجه ذخيره نمی شود و برای تشخيص آن از فلگ
Carry استفاده می شود. در مثال های 2 و 3 مجموع از 16 بيت بزرگتر است
و از بيت اضافی سمت چپ صرفنظر می شود. آخرين 4 بيت هميشه جمع درست
را نمی دهد. در مثال 4 هيچ رقم نقلی در آخرين بيت وجود ندارد اما جواب
صحيح نيست زيرا AC99 نمايش عدد 21351- است نه 44185. اين مشکل به دليل
بيشتر شدن حاصل جمع از بزرگترين عدد قابل نمايش در 16 بيت (32767+)
است.
در مثال آخر نيز پاسخ صحيح نيست 76EF نمايش عدد مثبت 30447 است. اين مشکل به دليل کمتر شدن حاصل جمع از کوچکترين عدد قابل نمايش در 16 بيت (32768-) است.
در مثال های 4و 5 پديده سرريزی رخ داده است. سخت افزار کامپيوتر قادر به تشخيص پديده سرريز ی هنگام عمل جمع نيست. کامپيوتر به طور عادی عمل جمع را انجام می دهد و پردازش بيت ها از راست به چپ می پردازد. هنگام جمع بيت ها گاهی يک رقم نقلی به ستون سمت چپ توليد می شود. اين رقم نقلی به جمع دو بيت ستون اضافه می شود. ستون خاص آخرين ستون سمت چپ يا بيت علامت است که ممکن است يک رقم نقلی به آن وارد(Carry In ) يا يک رقم نقلی از آن خارج(Carry Out) شود.
جدول زير به طور خلاصه بيان می کند که چه هنگام پديده سرريزی رخ می دهد:
Overflow? |
Carry Out of Sign bit |
Carry In to Sign bit |
No |
No |
No |
Yes |
Yes |
No |
Yes |
No |
Yes |
No |
Yes |
Yes |
تفريق
تفريق دو عدد به فرم مکمل2 از طريق تفريق دو عدد به صورت اعداد بدون علامت انجام می گيرد. اگر عدد دوم از اولی بزرگتر باشد يک واحد به عدد اول اضافه می شود که به آن رقم قرضی می گويند. پديده سرريزی برای عمل تفريق نيز وجود دارد و هنگامی رخ می دهد که حاصل تفريق از محدوده قابل نمايش خارج می شود. برای تشخيص آن کامپيوتر مسئله تفريق را توسط عمل جمع انجام می دهد يعنی مکمل2 عدد دوم را گرفته سپس با عدد اول جمع می کند. اگر در حاصل جمع پديده سرريزی رخ دهد يعنی در تفريق هم رخ داده است.
مثال.
195 | |
1 00C3 | |
00C3 |
- 618 | |
- 026A | => |
+ FD96 |
-423 | |
FE59 | |
FE59 |
ضرب و تقسيم
عمليات ضرب و تقسيم برای اعداد بدون علامت و علامتدار متفاوت از هم هستند. فرض
کنيد عدد FF را در خودش ضرب کنيد، در ضرب بدون علامت عدد 255 در 255
عدد 65025 را نتيجه می دهد يا FE01 ولی در ضرب علامتدار در واقع عدد
1- در 1- ضرب می شود و حاصل برابر با 1 می شود.
CPU هيچ نظری ندارد که يک بايت يا کلمه خاص چه چيزي می خواهد نمايش بدهد. اسمبلی نظری
درباره نوع هایی که زبان سطح بالا دارد ندارد. اين که داده چگونه تفسير
می شود بستگی به دستورالعملی دارد که روی داده کار می کند. اينکه عدد
FF برای نمايش عدد علامت دار 1- بکار رفته يا 255 بستگی به برنامه
نويس دارد. زبان C نوع های صحيح علامتدار و بدون علامت را تعريف می
کند و به کامپايلر اجازه می دهد تعيين کند دستورالعملی که با داده
کار می کند درست است يا خير.
سوالات چندگزينه اي درباره محاسبات مکمل 2
|