سلام
اول باید بدانید که محاسبات بیتی وابسته است به انداره متغیرهای مورد محاسبه.
مثلاً ...
جواب محاسبه فوق از 8 تا 64 بیتی با و بدون علامت در VB9 چنین خواهد بود:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
شاید به نظر شما این جواب ها مختلف باشند ولی از دید ریاضی مبنای دو این اعداد تغریباً برابر هستند و مشکل شما در عدم درک این تفاوت ناشی از عدم اطلاع از نحوه ذخیره اعداد منفی در رایانه میشود که طبق روشی موسوم به مکمل2 انجام میشود.
روش مکمل دو برای اعداد منفی چنین است که کل بیتهای عدد را معکوس کرده و سپس با 1 واحد کم میشود.
مثلاً اگر محاسبه یک بایتی باشد 13- چنین محاسبه و ذخیره میشود.
(در ج صفرهای اضافی تا انتهای متغییر بسیار لازم است!)
عدد 13 در قالب 8 بیتی
00001011
معکوس میشود
11110100
1- میشود
11110011
این عدد 13- در RAM در شرایط یک بایتی خواهد بود (SByte یا Int8 در VB9)
پس 11110011 در شرایط SByte یا Int8 میشود 13- ولی همین 11110011 اگر داخل یک Byte یا UInt8 باشد معنی 243+ را میدهد !!!!
حالا وقتی متغییر بزرگتر شود (مثلاً 16 بیتی) صفرهای خالی قبل از ان همه یک شده و عدد را بزرگتر میکنند.
عدد 13 در قالب 16 بیتی
0000000000001011
عدد 13- در قالب 16 بیتی
1111111111110011
باز هم 1111111111110011 در قالب علامت دار 16 بیتی (مثل Short یا Int16 در VB9) معنی 13- میدهد ولی همین مقدار در یک قالب 16 بیتی بدون علامت (مثل UShort یا UInt16 در VB9) معنی 65523 میدهد!!!
میبینید که فرق خاصی ندارد و همه جوابها یکی است.
=====
ولی اگر میخواهید بدانید که روش ریاضی مکمل2 برای جبر مبنای 2 از کجا آمده به اینت دقت کنید:
پس 13+ این شد:
00001011
و 13- هم این شد:
11110011
خوب حالا اگر 13+ با 13- جمع شود چه میشود؟
00000000
خوشتان امد! این یعنی دنیای زیبا و جذاب ریاضی.