كيف تتعامل المعالجات مع الأعداد السالبة؟ شرح ثنائي المتمم ولماذا تعتمد عليه وحدة المعالجة
مقدمة: لماذا تحتاج المعالجات إلى طريقة ذكية لتمثيل الأعداد السالبة؟
من أول الحقائق التي نتعلمها عن الحاسوب أنه لا يفهم في مستواه الأدنى سوى 0 و1، أي bits. أما نحن البشر فنتعامل مع الأرقام بالنظام العشري، ونستخدم الإشارتين + و- للتعبير عن القيم الموجبة والسالبة. هنا ظهر تحدٍ هندسي مهم: كيف يمكن للمعالج أن يمثل الأعداد السالبة وأن يجري عليها عمليات حسابية بكفاءة، وهو لا يملك سوى حالتين فقط؟
الإجابة جاءت عبر تصميم رياضي وهندسي شديد الأناقة، وهو ما يعرف باسم Two's Complement. هذا الأسلوب لم يسهّل فقط تمثيل الأعداد السالبة، بل جعل دوائر المعالج أبسط وأسرع وأقل استهلاكاً للطاقة.

خلفية أساسية: كيف ينفّذ الحاسوب التعليمات؟
كل ما يوجد داخل الحاسوب في النهاية يتحول إلى سلسلة من 0 و1: النصوص، الصور، الفيديوهات، البرامج، وحتى الأرقام. توجد آليات ترميز مختلفة لتحويل كل نوع من البيانات إلى صيغة ثنائية، مثل ASCII وUnicode للنصوص.
أما البرامج التي نكتبها، فتتحول إلى تعليمات آلة بواسطة أدوات مثل compiler وassembler. بعد ذلك تُخزَّن هذه التعليمات في الذاكرة الرئيسية RAM، ثم يبدأ المعالج بتنفيذها عبر دورة معروفة باسم fetch-decode-execute.

تعمل هذه الدورة على النحو التالي:
- يجلب المعالج التعليمة من الذاكرة.
- تفك وحدة التحكم التعليمة إلى جزأين:
opcodeوoperands. - يحدد
opcodeنوع العملية المطلوبة، مثلADDأوJMPأوINC. - تمثل
operandsالقيم أو المواقع التي ستُنفذ عليها العملية. - تنتقل التعليمة إلى وحدة الحساب والمنطق
ALUلتطبيق العملية ثم حفظ النتيجة.
على سبيل المثال، التعليمة ADD eax, 42 تعني إضافة القيمة 42 إلى السجل eax. فإذا كانت قيمة eax الحالية هي 20، فستصبح بعد التنفيذ 62.
الصيغة المنطقية لهذه العملية هي: eax = eax + 42.

في الحواسيب المبكرة مثل EDVAC، كان الهدف الأساسي هو تسريع الحسابات الرياضية الشاقة. ولهذا بُنيت كثير من مكونات الحوسبة حول دوائر الجمع، لأن الطرح والضرب والقسمة يمكن في النهاية تفكيكها إلى عمليات تعتمد على الجمع. من هنا نفهم لماذا كان تمثيل الأعداد السالبة بكفاءة مسألة مركزية في تصميم المعالجات.
كيف يعمل النظام الثنائي؟
في النظام العشري، تعتمد قيمة الرقم على موضعه. فكل خانة تحمل وزناً يساوي قوة من قوى 10، مثل 10^0 و10^1 و10^2، وهكذا.

أما في النظام الثنائي، فالأمر نفسه تقريباً، لكن أوزان الخانات تنمو وفق قوى العدد 2 بدلاً من 10. أي أن الخانات تمثل 2^0 و2^1 و2^2 وما بعدها.

مثلاً، العدد الثنائي 00110101 يساوي عشرياً 53. يحسب الحاسوب هذه القيمة تماماً كما نحسب نحن العدد العشري: بضرب كل خانة في وزنها ثم جمع النتائج.
كيفية جمع الأعداد الثنائية
عملية الجمع في النظام الثنائي تشبه كثيراً الجمع العشري، مع اختلاف أن الخانات لا تحتوي إلا على 0 و1.
لنأخذ المثال التالي: جمع 1101 أي 13 مع 1100 أي 12.

نبدأ من أقصى اليمين، أي من خانة 2^0. جمع 1 مع 0 يعطينا 1.

في الخانة التالية، 0 + 0 = 0.

ثم نصل إلى 1 + 1، والناتج هنا هو 10 بالنظام الثنائي، أي نضع 0 ونرحّل 1 إلى الخانة التالية.

في النهاية نحصل على 11001، وهو يساوي 25 بالنظام العشري، وهذا صحيح لأن 13 + 12 = 25.
لكن هناك نقطة مهمة: إذا كان الجهاز يعمل بعرض 4-bit فقط، فلن يتمكن من تخزين البت الخامس. هذه الحالة تسمى overflow، وغالباً تُهمل البتات الزائدة في حسابات الأعداد الصحيحة. عندها تصبح النتيجة المخزنة 1001 فقط.
مفاهيم أساسية قبل الدخول إلى الأعداد السالبة
قبل الحديث عن السالب، نحتاج إلى فهم مصطلحين مهمين:
LSBأوLeast Significant Bit: وهو البت الموجود في أقصى اليمين، ويحمل أقل وزن.MSBأوMost Significant Bit: وهو البت الموجود في أقصى اليسار، ويحمل أعلى وزن.

لو كانت الأعداد الموجبة فقط هي الموجودة، لتوقف الشرح هنا. لكن وجود الأعداد السالبة هو ما جعل تصميم الحساب داخل المعالجات أكثر عمقاً وذكاءً.
الطريقة الأولى: تمثيل الإشارة والمقدار Sign Magnitude
في هذا الأسلوب، يُستخدم البت الأيسر MSB بوصفه بت الإشارة:
0يعني أن العدد موجب.1يعني أن العدد سالب.
أما بقية البتات فتمثل مقدار العدد.

مثلاً، العدد 1101 في هذا النظام يعني:
- البت الأول
1← العدد سالب. - القيمة المتبقية
101← تساوي5. - إذن الناتج هو
-5.

ظاهرياً يبدو الأسلوب منطقياً، لكنه يعاني مشكلة كبيرة عند إجراء العمليات الحسابية.
مشكلة هذا الأسلوب في العمليات الحسابية
لنفترض أننا نريد جمع +4 مع -1. النتيجة المتوقعة هي +3 أي 0011.

لكن الناتج لا يخرج صحيحاً عند تطبيق الجمع الثنائي المباشر. وهذا يعني أن المعالج سيحتاج إلى منطق إضافي للتعامل مع الإشارات أثناء كل عملية جمع أو طرح. هذه الزيادة في التعقيد غير مرغوبة هندسياً، لأنها ترفع استهلاك الطاقة وتزيد تكلفة الدوائر وتضعف الأداء، خصوصاً في الحواسيب المبكرة.
الحل الأذكى: نظام ثنائي المتمم Two's Complement
هنا تظهر الفكرة العبقرية التي ما زالت تستخدم في معظم المعالجات الحديثة. في هذا النظام:
- الأعداد الموجبة تُمثَّل كما هي تقريباً، مع وجود
0في البت الأعلى. - الأعداد السالبة لا تُكتب فقط بتبديل بت الإشارة، بل عبر عمليتين رياضيتين منظمتين.
لنرَ كيف نمثل العدد -6 انطلاقاً من +6.
الخطوة الأولى: عكس جميع البتات
العدد +6 في 4-bit هو 0110.

نعكس البتات:
0تصبح11تصبح0
فتتحول 0110 إلى 1001. هذه النتيجة تسمى One's Complement.
الخطوة الثانية: إضافة 1

نضيف 0001 إلى 1001، فنحصل على 1010. وهذا هو تمثيل -6 في نظام Two's Complement.

باختصار:
- اعكس البتات.
- أضف
1.
وهكذا تحصل على النظير السالب للعدد.

لماذا يعد ثنائي المتمم أفضل من تمثيل الإشارة والمقدار؟
القيمة الحقيقية لهذا النظام تظهر عند تنفيذ العمليات الحسابية. لنجرب جمع 0100 أي +4 مع 1111 أي -1.

سنحصل مباشرة على الناتج الصحيح: 0011 أي +3. وهذا يعني أن المعالج يمكنه جمع الأعداد دون الحاجة إلى منطق خاص لكل إشارة. يكفي استخدام دائرة الجمع نفسها.
هذا هو جوهر الجمال الهندسي في Two's Complement: توحيد طريقة التعامل مع الموجب والسالب داخل العتاد.
كيف يفك النظام أو المبرمج قيمة عدد سالب مخزّن بالثنائي؟
لنفترض أن السجل eax يحتوي على القيمة 1100. كيف نعرف أن هذه القيمة تعني -4؟
القاعدة العملية بسيطة:
- إذا كان البت الأعلى
MSBيساوي0فالعدد موجب، ونقرأه مباشرة. - إذا كان يساوي
1فالعدد سالب. - لحساب قيمته، نأخذ
Two's Complementله مرة أخرى لنحصل على القيمة الموجبة المقابلة.

فمثلاً:
- القيمة المخزنة:
1100 - بما أن البت الأعلى
1← العدد سالب - نحسب
Two's Complementللعدد1100 - الناتج
0100أي4 - إذن القيمة الأصلية هي
-4
ومن الخصائص الجميلة في هذا النظام أن تطبيق Two's Complement على عدد سالب يعيدك إلى المقابل الموجب، والعكس صحيح.
لماذا تعمل هذه الفكرة رياضياً؟
لفهم السبب، تخيل أنك تريد إيجاد سالب عدد ما، مثل +42. أبسط تفسير رياضي لذلك هو طرحه من الصفر:
0 - 42 = -42
وإذا طرحت -42 من الصفر فستعود إلى +42.
هذه الفكرة البسيطة هي الأساس العميق وراء Two's Complement.

لنأخذ مثالاً على العدد 0101 أي +5. في نظام 4-bit يمكن تمثيل الصفر مع حمل إضافي بالشكل 10000 إذا تجاهلنا بت الفيض overflow. عند إجراء العملية 10000 - 0101 نحصل على التمثيل الثنائي لـ -5.
والفكرة الأذكى أن:
10000 = 1111 + 0001
لذلك يمكن إعادة كتابة العملية هكذا:
10000 - 0101 = (1111 + 0001) - 0101
ثم نعيد ترتيبها إلى:
(1111 + 0001) - 0101 = (1111 - 0101) + 0001
وعند طرح 0101 من 1111 نحصل عملياً على عكس البتات، ثم نضيف 1. وهذا بالضبط هو تعريف Two's Complement.
Step 1: invert 0101 => 1010
Step 2: add 1 => 1011
إذن، عكس البتات ثم إضافة واحد ليس حيلة عشوائية، بل طريقة سريعة جداً لتنفيذ العملية 0 - number دون الحاجة إلى دائرة طرح مستقلة ومعقدة.
كيف استفادت المعالجات من هذا الأسلوب؟
بفضل نظام Two's Complement، أصبحت المعالجات قادرة على تنفيذ الطرح عبر الجمع فقط. فبدلاً من تصميم دوائر طرح كاملة، يكفي:
- تحويل العدد المراد طرحه إلى نظيره السالب باستخدام
Two's Complement. - إضافته إلى العدد الأصلي.
مثلاً، لحساب 100 - 12، يمكن للمعالج أن يحول 12 إلى -12 ثم ينفذ عملية جمع واحدة.
هذا القرار التصميمي وفر مزايا كبيرة:
- تبسيط دوائر
ALU. - تقليل استهلاك الطاقة.
- خفض تكلفة التصنيع.
- تحسين الأداء.
- توحيد منطق العمليات الحسابية داخل المعالج.
وفي الحواسيب القديمة، كانت هذه المزايا حاسمة جداً لأن كل دائرة إضافية كانت تعني مزيداً من الصمامات المفرغة أو الترانزستورات أو الكلفة والصيانة.
ملخص سريع لأهم الأفكار
- الحاسوب لا يفهم إلا
0و1. - تمثيل الأعداد الموجبة في الثنائي سهل ومباشر.
- تمثيل الأعداد السالبة بطريقة
Sign Magnitudeيسبب مشاكل في العمليات الحسابية. - نظام
Two's Complementيحل هذه المشكلة بأناقة. - حساب
Two's Complementيتم عبر عكس البتات ثم إضافة1. - هذا النظام يجعل الطرح ممكناً باستخدام دوائر الجمع فقط.
- معظم المعالجات الحديثة تعتمد هذا الأسلوب حتى اليوم.
الخلاصة التقنية
يعكس نظام Two's Complement مبدأً مهماً في هندسة المعالجات: أفضل الحلول ليست دائماً الأكثر وضوحاً، بل الأكثر كفاءة واتساقاً مع العتاد. فبدلاً من بناء منطق منفصل للتعامل مع الأعداد السالبة، مكّن هذا الترميز المعالج من استخدام البنية نفسها تقريباً للجمع والطرح معاً. لهذا لا يُعد Two's Complement مجرد طريقة ترميز، بل قراراً معمارياً ذكياً ساهم في تبسيط تصميم CPU ورفع أدائه عبر أجيال طويلة من الحوسبة.