سؤال

أنا في دورة أنظمة الكمبيوتر، ولقد كان يكافح, ، جزئيا، مع متمم ثنائي.أريد أن أفهم ذلك ولكن كل ما قرأته لم يجمع الصورة بالنسبة لي.لقد قرأت مقالة ويكيبيديا ومقالات أخرى مختلفة، بما في ذلك كتابي النصي.

ولهذا أردت أن أبدأ بهذا ويكي المجتمع منشور لتعريف ما هو Two's Complement، وكيفية استخدامه وكيف يمكن أن يؤثر على الأرقام أثناء عمليات مثل التحويل (من الموقعة إلى غير الموقعة والعكس)، وعمليات البت وعمليات تحويل البتات.

ما آمله هو تعريف واضح وموجز والتي يمكن فهمها بسهولة من قبل المبرمج.

هل كانت مفيدة؟

المحلول

تُعد تكملة Two طريقة ذكية لتخزين الأعداد الصحيحة بحيث تكون المسائل الرياضية الشائعة سهلة التنفيذ للغاية.

لفهم ذلك، عليك أن تفكر في الأرقام الثنائية.

تقول في الأساس،

  • للصفر، استخدم كل الأصفار.
  • بالنسبة للأعداد الصحيحة الموجبة، ابدأ العد التصاعدي بحد أقصى 2(عدد البتات - 1)-1.
  • بالنسبة للأعداد الصحيحة السالبة، افعل نفس الشيء تمامًا، ولكن قم بتبديل دور الأصفار والواحد (لذا بدلاً من البدء بـ 0000، ابدأ بالرقم 1111 - هذا هو الجزء "المكمل").

دعونا نجرب ذلك باستخدام بايت صغير مكون من 4 بتات (سنسميه عاب - 1/2 بايت).

  • 0000 - صفر
  • 0001 - واحد
  • 0010 - اثنين
  • 0011 - ثلاثة
  • 0100 ل 0111 - من أربعة إلى سبعة

هذا أقصى ما يمكننا أن نذهب إليه بشكل إيجابي.23-1 = 7.

بالنسبة للسلبيات:

  • 1111 - واحدة سلبية
  • 1110 - سلبي اثنين
  • 1101 - سلبي ثلاثة
  • 1100 ل 1000 - من سالب أربعة إلى سالب ثمانية

لاحظ أنك تحصل على قيمة إضافية واحدة للسلبيات (1000 = -8) أنك لا تفعل ذلك من أجل الإيجابيات.هذا بسبب 0000 يستخدم للصفر.يمكن اعتبار هذا رقم الخط من أجهزة الكمبيوتر.

التمييز بين الأرقام الموجبة والسالبة

عند القيام بذلك، تحصل البتة الأولى على دور بتة "الإشارة"، حيث يمكن استخدامها للتمييز بين القيم العشرية الموجبة والسالبة.إذا كان الشيء الأكثر أهمية هو 1, ، فيمكن القول بأن الثنائي سالب، حيث كما لو أن البتة الأكثر أهمية (أقصى اليسار) هي 0, ، يمكنك القول أن تمييز القيمة العشرية موجب.

الأرقام السالبة "مجاملة الشخص" تقلب علامة الإشارة فقط، ثم تعد من 0.لكن هذا النهج يجب أن يتعامل مع الترجمة الشفوية 1000 باسم "الصفر السلبي" وهو أمر محير.بشكل عام، لا داعي للقلق بشأن هذا الأمر إلا عند العمل بالقرب من الأجهزة.

نصائح أخرى

أتساءل عما إذا كان من الممكن تفسير ذلك بشكل أفضل من مقالة ويكيبيديا.

المشكلة الأساسية التي تحاول حلها من خلال التمثيل المكمل لاثنين هي مشكلة تخزين الأعداد الصحيحة السالبة.

خذ بعين الاعتبار أولاً عددًا صحيحًا غير موقّع مخزّنًا في 4 بتات.يمكنك الحصول على ما يلي

0000 = 0
0001 = 1
0010 = 2
...
1111 = 15

هذه غير موقعة لأنه لا يوجد ما يشير إلى ما إذا كانت سلبية أم إيجابية.

علامة الحجم والتدوين الزائد

لتخزين الأرقام السالبة، يمكنك تجربة عدد من الأشياء.أولاً، يمكنك استخدام تدوين حجم الإشارة الذي يعين البت الأول كبت إشارة لتمثيل +/- والبتات المتبقية لتمثيل الحجم.لذا، استخدم 4 بتات مرة أخرى وبافتراض أن 1 يعني - و0 يعني + فهذا يعني أن لديك

0000 = +0
0001 = +1
0010 = +2
...
1000 = -0
1001 = -1
1111 = -7

إذن، هل ترى المشكلة هناك؟لدينا الإيجابية والسلبية 0.المشكلة الأكبر هي جمع وطرح الأرقام الثنائية.ستكون دوائر الجمع والطرح باستخدام حجم الإشارة معقدة للغاية.

ما هو

0010
1001 +
----

?

نظام آخر هو التدوين الزائد.يمكنك تخزين الأرقام السالبة، وتتخلص من مشكلة الصفرين ولكن يبقى الجمع والطرح صعبا.

لذلك يأتي على طول تكملة اثنين.يمكنك الآن تخزين الأعداد الصحيحة الموجبة والسالبة وإجراء العمليات الحسابية بسهولة نسبية.هناك عدد من الطرق لتحويل رقم إلى مكمل اثنين.هنا واحد.

تحويل العشري إلى تكملة اثنين

  1. تحويل الرقم إلى ثنائي (تجاهل العلامة في الوقت الحالي) على سبيل المثال5 هو 0101 و-5 هو 0101

  2. إذا كان الرقم رقمًا موجبًا، فقد انتهيت.على سبيل المثال5 هو 0101 في النظام الثنائي باستخدام التدوين المكمل الثنائي.

  3. إذا كان الرقم سلبيا ثم

    3.1 ابحث عن مكمل (عكس 0 و 1) على سبيل المثال-5 هو 0101 لذا فإن إيجاد المكمل هو 1010

    3.2 أضف 1 إلى المكمل 1010 + 1 = 1011.وبالتالي، -5 في مكمل اثنين هو 1011.

إذن، ماذا لو أردت إجراء 2 + (-3) بالنظام الثنائي؟2 + (-3) يساوي -1.ماذا عليك أن تفعل إذا كنت تستخدم حجم الإشارة لإضافة هذه الأرقام؟0010 + 1101 = ؟

باستخدام تكملة اثنين، فكر في مدى سهولة ذلك.

 2  =  0010
 -3 =  1101 +
 -------------
 -1 =  1111

تحويل تكملة اثنين إلى عشري

تحويل 1111 إلى رقم عشري:

  1. الرقم يبدأ بـ 1، فهو سالب، فنجد متمم 1111، وهو 0000.

  2. أضف 1 إلى 0000 نحصل على 0001.

  3. تحويل 0001 إلى رقم عشري، وهو 1.

  4. قم بتطبيق العلامة = -1.

تادا!

مثل معظم التفسيرات التي رأيتها، فإن التفسيرات المذكورة أعلاه واضحة حول كيفية العمل مع مكمل 2، ولكنها لا تشرح حقًا ما هي نكون رياضيا.سأحاول القيام بذلك، للأعداد الصحيحة على الأقل، وسأغطي بعض الخلفية التي ربما تكون مألوفة أولاً.

أذكر كيف يعمل مع العلامة العشرية:
  2345
هي طريقة للكتابة
  2 × 103 + 3 × 102 + 4 × 101 + 5 × 100.

بنفس الطريقة، الثنائية هي طريقة لكتابة الأرقام باستخدام فقط 0 و 1 باتباع نفس الفكرة العامة، ولكن مع استبدال العشرات أعلاه بـ 2.ثم في الثنائية،
  1111
هي طريقة للكتابة
  1 × 23 + 1 × 22 + 1 × 21 + 1 × 20
وإذا حسبتها، فسيصبح 15 (الأساس 10).هذا لأنه كذلك
  8+4+2+1 = 15.

كل هذا جيد وجيد بالنسبة للأرقام الإيجابية.حتى أنه يعمل مع الأرقام السالبة إذا كنت على استعداد فقط لوضع علامة الطرح أمامها، كما يفعل البشر مع الأرقام العشرية.ويمكن القيام بذلك حتى على أجهزة الكمبيوتر، نوعًا ما، لكنني لم أر مثل هذا الكمبيوتر منذ أوائل السبعينيات.سأترك الأسباب لمناقشة مختلفة.

بالنسبة لأجهزة الكمبيوتر، فقد تبين أن استخدام ملف إطراء تمثيل للأرقام السالبة.وهنا شيء غالبا ما يتم تجاهله.تتضمن الرموز التكميلية نوعًا من عكس أرقام الرقم، حتى الأصفار الضمنية التي تأتي قبل الرقم الموجب العادي.هذا أمر محرج، لأن السؤال الذي يطرح نفسه:كل منهم؟يمكن أن يكون هذا عددًا لا حصر له من الأرقام التي يجب أخذها في الاعتبار.

لحسن الحظ، أجهزة الكمبيوتر لا تمثل اللانهاية.الأرقام مقيدة بطول معين (أو عرض، إذا كنت تفضل ذلك).لذلك دعونا نعود إلى الأعداد الثنائية الموجبة، ولكن بحجم معين.سأستخدم 8 أرقام ("بت") لهذه الأمثلة.إذن سيكون العدد الثنائي لدينا حقًا
  00001111
أو
  0 × 27 + 0 × 26 + 0 × 25 + 0 × 24 + 1 × 23 + 1 × 22 + 1 × 21 + 1 × 20

لتكوين الرقم السالب المكمل للرقم 2، نقوم أولاً بتكملة جميع الأرقام (الثنائية) المراد تكوينها
  11110000
وأضف 1 إلى النموذج
  11110001
ولكن كيف لنا أن نفهم أن هذا يعني -15؟

الجواب هو أننا نغير معنى البت ذو الترتيب العالي (أقصى اليسار).هذا الشيء سيكون أ 1 لجميع الأرقام السالبة.التغيير سيكون بتغيير إشارة مساهمته إلى قيمة الرقم الذي يظهر فيه.حتى الآن لدينا 11110001 ومن المفهوم أن يمثل
  -1 × 27 + 1 × 26 + 1 × 25 + 1 × 24 + 0 × 23 + 0 × 22 + 0 × 21 + 1 × 20
لاحظ أن "-" أمام هذا التعبير؟وهذا يعني أن بت الإشارة يحمل الوزن -27, ، أي -128 (الأساس 10).تحتفظ جميع المواضع الأخرى بنفس الوزن الذي كانت عليه في الأرقام الثنائية غير الموقعة.

بحساب -15، فهو كذلك
  -128 + 64 + 32 + 16 + 1
جربه على الآلة الحاسبة الخاصة بك.انها -15.

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

والأكثر غرابة في هذا الرقم هو أنك إذا حاولت تكوينه موجبًا عن طريق تكملة وإضافة رقم واحد، فستحصل على نفس الرقم السالب مرة أخرى.يبدو طبيعيًا أن الصفر سيفعل ذلك، لكن هذا غير متوقع وليس على الإطلاق السلوك الذي اعتدنا عليه لأنه بغض النظر عن أجهزة الكمبيوتر، فإننا نفكر عمومًا في عدد غير محدود من الأرقام، وليس في هذه العملية الحسابية ذات الطول الثابت.

وهذا مثل غيض من فيض من الشذوذات.هناك المزيد من الانتظار تحت السطح، لكن هذا يكفي لهذه المناقشة.ربما يمكنك العثور على المزيد إذا بحثت عن "التجاوز" لحساب النقاط الثابتة.إذا كنت تريد حقًا الخوض في هذا الأمر، فيمكنك أيضًا البحث عن "الحساب المعياري".

يعد ملحق 2 مفيدًا جدًا للعثور على قيمة الثنائي، لكنني فكرت في طريقة أكثر إيجازًا لحل مثل هذه المشكلة (لم أر أي شخص آخر ينشرها):

خذ ثنائي، على سبيل المثال:1101 وهو [بافتراض أن المساحة "1" هي العلامة] يساوي -3.

باستخدام تكملة 2 سنفعل هذا...اقلب 1101 إلى 0010...أضف 0001 + 0010 ===> يعطينا 0011.0011 في الثنائي الموجب = 3.وبالتالي 1101 = -3!

ما أدركته:

بدلاً من كل عمليات التقليب والإضافة، يمكنك فقط القيام بالطريقة الأساسية لحل الثنائي الموجب (دعنا نقول 0101) هو (23 * 0) + (22 * 1) + (21 * 0) + (20 * 1) = 5.

افعل نفس المفهوم تمامًا مع النفي! (مع لمسة بسيطة)

خذ 1101 على سبيل المثال:

للرقم الأول بدلا من 23 * 1 = 8 ، افعل -(23 * 1) = -8.

ثم تابع كالمعتاد، به -8 + (22 * 1) + (21 * 0) + (20 * 1) = -3

تخيل أن لديك عددًا محدودًا من البتات/التريت/الأرقام/أيًا كان.يمكنك تعريف 0 على أن جميع الأرقام هي 0، ويتم العد تصاعديًا بشكل طبيعي:

00
01
02
..

في النهاية سوف تفيض.

98
99
00

لدينا رقمين ويمكننا تمثيل جميع الأرقام من 0 إلى 100.كل هذه الأرقام إيجابية!لنفترض أننا نريد تمثيل الأرقام السالبة أيضا؟

ما لدينا حقا هو دورة.الرقم قبل 2 هو 1الرقم قبل 1 هو 0الرقم قبل 0 هو... 99.

لذا، للتبسيط، لنفترض أن أي رقم يزيد عن 50 يكون سالبًا."0" إلى "49" تمثل 0 إلى 49."99" يساوي -1، "98" يساوي -2، ..."50" هو -50.

هذا التمثيل تكملة العشرة.تستخدم أجهزة الكمبيوتر عادة متمم ثنائي, ، وهو نفس الشيء باستثناء استخدام البتات بدلاً من الأرقام.

الشيء الجميل في مكمل العشرة هو تلك الإضافة يعمل فقط.لا تحتاج إلى القيام بأي شيء خاص لإضافة أرقام موجبة وسالبة!

تم العثور على المكملين بإضافة واحد إلى المكمل الأول للرقم المحدد.لنفترض أنه يتعين علينا معرفة تكملة الثنائيات 10101 ثم ابحث عن تكملة الآحاد، وهذا هو، 01010 يضيف 1 إلى هذه النتيجة، أي 01010+1=01011, ، وهو الجواب النهائي.

قرأت شرحا رائعا على رديت بواسطة jng، باستخدام عداد المسافات كقياس.

enter image description here

إنها اتفاقية مفيدة.لا تزال الدوائر نفسها والعمليات المنطقية التي تضيف / طرح أرقام إيجابية في الثنائية تعمل على كل من الأرقام الإيجابية والسلبية في حالة استخدام الاتفاقية ، ولهذا السبب يكون مفيدًا للغاية وموجودًا في كل مكان.

تخيل أن عداد مسافة السيارة يدور عند (على سبيل المثال) 99999.إذا قمت بزيادة 00000 تحصل على 00001.إذا قمت بتخفيض 00000 ، فستحصل على 99999 (بسبب الرول).إذا أضفت مرة واحدة إلى 99999 ، فسيعود إلى 00000.لذلك من المفيد أن تقرر أن الرقم 99999 يمثل -1.وبالمثل، من المفيد جدًا أن نقرر أن الرقم 99998 يمثل -2، وهكذا.يجب أن تتوقف في مكان ما ، وأيضًا من خلال الاتفاقية ، يعتبر النصف العلوي من الأرقام سلبيًا (50000-99999) ، والنصف الإيجابي السفلي فقط يقف لأنفسهم (00000-49999).ونتيجة لذلك ، فإن الرقم العلوي هو 5-9 يعني أن الرقم الممثل سلبي ، وأنه 0-4 يعني أن الممثلين إيجابي-تمامًا مثل البت الأعلى الذي يمثل علامة في رقم ثنائي مكمّل.

كان فهم هذا أمرًا صعبًا بالنسبة لي أيضًا.بمجرد أن حصلت عليها وعدت لإعادة قراءة المقالات والتفسيرات (لم يكن هناك إنترنت في ذلك الوقت) ، اتضح أن الكثير من أولئك الذين يصفونها لم يفهموها حقًا.لقد كتبت لغة تجميع تدريس كتاب بعد ذلك (والتي تم بيعها بشكل جيد لمدة 10 سنوات).

لنحصل على الإجابة 10 - 12 في شكل ثنائي باستخدام 8 بت:ما سنفعله حقًا هو 10 + (-12)

علينا الحصول على الجزء المجامل من 12 لطرحه من 10.12 في الثنائي هو 00001100.10 في الثنائي هو 00001010.

للحصول على الجزء المجامل من 12، نقوم فقط بعكس جميع البتات ثم نضيف 1.12 في الثنائي المعكوس هو 11110011.وهذا أيضًا هو الرمز العكسي (المكمل للفرد).الآن نحن بحاجة إلى إضافة واحد، وهو الآن 11110100.

لذا فإن 11110100 هو مكمل للعدد 12!من السهل عندما تفكر في الأمر بهذه الطريقة.

الآن يمكنك حل السؤال أعلاه وهو 10 - 12 في شكل ثنائي.

00001010
11110100
-----------------
11111110  

بالنظر إلى النظام المكمل للاثنين من وجهة نظر الرياضيات، فمن المنطقي حقًا.في تكملة العشرة، الفكرة هي في الأساس "عزل" الفرق.

مثال:63 - 24 = س

نضيف تكملة 24 وهي في الحقيقة فقط (100 - 24).إذن، كل ما نفعله هو إضافة 100 إلى طرفي المعادلة.

الآن المعادلة هي:100 + 63 - 24 = x + 100، ولهذا نحذف 100 (أو 10 أو 1000 أو أيًا كان).

نظرًا للموقف غير المناسب المتمثل في الاضطرار إلى طرح رقم واحد من سلسلة طويلة من الأصفار، فإننا نستخدم نظام "مكمل الجذر المتناقص"، في النظام العشري، مكمل التسعة.

عندما يُعرض علينا رقم مطروح من سلسلة كبيرة من التسعات، نحتاج فقط إلى عكس الأرقام.

مثال:99999 - 03275 = 96724

ولهذا السبب، بعد تكملة التسعة، نضيف 1.كما تعلم على الأرجح من رياضيات الطفولة، 9 يصبح 10 عن طريق "سرقة" 1.لذا، فإن مكمل العشرة فقط هو الذي يأخذ 1 من الفرق.

في النظام الثنائي، مكمل الاثنين يعادل مكمل العشرة، في حين أن مكمل الواحد يعادل مكمل التسعة.الفرق الأساسي هو أنه بدلاً من محاولة عزل الفرق باستخدام قوى العشرة (إضافة 10، 100، إلخ).في المعادلة) نحن نحاول عزل الفرق باستخدام قوى العدد اثنين.

ولهذا السبب نقوم بعكس البتات.تمامًا كما هو الحال مع الطرح الخاص بنا فهو عبارة عن سلسلة من التسعات في النظام العشري، فإن الطرح الخاص بنا هو سلسلة من الآحاد في النظام الثنائي.

مثال:111111 - 101001 = 010110

نظرًا لأن سلاسل الآحاد هي 1 أقل من قوة لطيفة من اثنين، فإنها "تسرق" 1 من الفرق كما تفعل التسعة في النظام العشري.

عندما نستخدم الأرقام الثنائية السالبة، فإننا نقول فقط:

0000 - 0101 = س

1111 - 0101 = 1010

1111 + 0000 - 0101 = س + 1111

من أجل "عزل" x، نحتاج إلى إضافة 1 لأن 1111 يبعد واحدًا عن 10000 وقمنا بإزالة الرقم 1 البادئ لأننا أضفناه للتو إلى الفرق الأصلي.

1111 + 1 + 0000 - 0101 = س + 1111 + 1

10000 + 0000 - 0101 = س + 10000

فقط أزل 10000 من كلا الطرفين للحصول على x، إنه الجبر الأساسي.

تشرح العديد من الإجابات حتى الآن بشكل جيد سبب استخدام مكمل اثنين لتمثيل الرقم السالب، لكنها لا تخبرنا ما هو الرقم المكمل لاثنين، ولا سيما سبب إضافة الرقم "1"، وفي الواقع يتم إضافته في كثير من الأحيان بطريقة خاطئة.

يأتي الارتباك من الفهم السيئ لتعريف الرقم المكمل.المكمل هو الجزء المفقود الذي من شأنه أن يجعل شيئا كاملا.

تكملة الجذر لعدد n من الأرقام x في الجذر b هو، حسب التعريف، b^n-x.في النظام الثنائي، يتم تمثيل 4 بـ 100، والذي يتكون من 3 أرقام (n=3) وجذر 2 (b=2).لذا فإن مكمل الجذر هو b^n-x = 2^3-4=8-4=4 (أو 100 في النظام الثنائي).

ومع ذلك، في النظام الثنائي، فإن الحصول على مكمل الجذر ليس سهلاً مثل الحصول على مكمل الجذر المتناقص، والذي يتم تعريفه على أنه (b^n-1)-y، أقل بمقدار 1 فقط من مكمل الجذر.للحصول على مكمل جذري متناقص، ما عليك سوى قلب جميع الأرقام.

100 -> 011 (تناقص تكملة الجذر)

للحصول على تكملة الجذر (الاثنين)، نضيف ببساطة 1، كما هو محدد في التعريف.

011 +1 ->100 (مكملان).

الآن مع هذا الفهم الجديد ، دعونا نلقي نظرة على المثال الذي قدمه فنسنت رامدهاني (انظر أعلاه الرد الثاني)

/* بداية فنسنت

تحويل 1111 إلى رقم عشري:

الرقم يبدأ بـ 1، فهو سالب، فنجد متمم 1111، وهو 0000.أضف 1 إلى 0000 نحصل على 0001.تحويل 0001 إلى رقم عشري، وهو 1.قم بتطبيق العلامة = -1.تادا!

نهاية فنسنت */

ينبغي أن يفهم على أنه

الرقم يبدأ بـ 1، لذا فهو سلبي.لذلك نحن نعلم أنه مكمل ثنائي لبعض القيمة x.للعثور على x الممثلة بمكملها الاثنين، نحتاج أولاً إلى العثور على مكملها 1.

تكملة اثنين من x:1111 تكمل واحد من X:1111-1 ->1110;س = 0001، (اقلب جميع الأرقام)

ضع الإشارة -، والإجابة =-x =-1.

أعجبتني إجابة لافينيو، لكن تغيير الأجزاء يضيف بعض التعقيد.غالبًا ما يكون هناك خيار بين البتات المتحركة مع احترام بت الإشارة أو عدم احترام بت الإشارة.هذا هو الاختيار بين معاملة الأرقام على أنها موقعة (-8 إلى 7 للقضم، -128 إلى 127 للبايت) أو أرقام غير موقعة كاملة النطاق (0 إلى 15 للقضم، من 0 إلى 255 للبايت).

إنها وسيلة ذكية لتشفير الأعداد الصحيحة السالبة بحيث يتم حجز ما يقرب من نصف مجموعة البتات من نوع البيانات للأعداد الصحيحة السالبة، كما أن إضافة معظم الأعداد الصحيحة السالبة مع الأعداد الصحيحة الموجبة المقابلة لها يؤدي إلى تجاوز سعة النقل وهذا يترك النتيجة لتكون صفر ثنائي.

لذلك، في تكملة 2، إذا كان أحدهما هو 0x0001، فإن -1 هو 0x1111، لأن ذلك سيؤدي إلى مجموع مجمع قدره 0x0000 (مع تجاوز 1).

2 يكمل:عندما نضيف واحدًا إضافيًا مع مكملات الـ 1 لرقم ما، سنحصل على مكملات الـ 2.على سبيل المثال:100101 مكمل 1 هو 011010 ومكمل 2 هو 011010+1 = 011011 (بإضافة واحد مع مكمل 1) للمزيد من المعلومات هذه المقالة تشرح ذلك بيانيا.

لقد واجهت نفس المشكلة منذ بضعة أسابيع.انتهى بي الأمر بالقراءة عنها عبر الإنترنت من مصادر مختلفة، محاولًا تجميع الأجزاء معًا، والكتابة عنها بنفسي فقط للتأكد من أنني فهمتها بشكل صحيح.نحن نستخدم تكملة اثنين لسببين رئيسيين:

  1. لتجنب تمثيلات متعددة من 0
  2. لتجنب تتبع لقمة الحمل (كما هو الحال في المكمل) في حالة الفائض.
  3. أصبح إجراء العمليات البسيطة مثل الجمع والطرح أمرًا سهلاً.

إذا كنت تريد شرحًا أكثر تفصيلاً للمسألة المطروحة، فجرب المقالة التي كتبتها هنا.نأمل أن يساعد!

كلمة تكملة مشتقة من الاكتمال.في العالم العشري الأرقام من 0 إلى 9 توفر أ إطراء (مجموعة كاملة) من الأرقام أو الرموز الرقمية للتعبير عن جميع الأرقام العشرية.في العالم الثنائي، توفر الأرقام 0 و 1 أ إطراء من الأرقام للتعبير عن جميع الأرقام الثنائية.في الواقع، يجب استخدام الرمزين 0 و1 لتمثيل كل شيء (النص والصور وما إلى ذلك) بالإضافة إلى الرمز الموجب (0) والسالب (1).في عالمنا المساحة الفارغة على يسار الرقم تعتبر صفر:

                  35=035=000000035.

في موقع تخزين الكمبيوتر لا توجد مساحة فارغة.يجب أن تكون جميع البتات (الأرقام الثنائية) إما 0 أو 1.لاستخدام أرقام الذاكرة بكفاءة، يمكن تخزينها على هيئة تمثيلات 8 بت، 16 بت، 32 بت، 64 بت، 128 بت.عندما يتم نقل رقم تم تخزينه كرقم مكون من 8 بتات إلى موقع مكون من 16 بت، يجب أن تظل الإشارة والحجم (القيمة المطلقة) كما هي.كل من تمثيلات تكملة 1 و 2 تسهل ذلك.كإسم:كل من مكمل 1 ومكمل 2 عبارة عن تمثيلات ثنائية للكميات الموقعة حيث تكون البتة الأكثر أهمية (الموجودة على اليسار) هي بتة الإشارة.0 للإيجابية و 1 للسالب.تكملة 2S لا تعني سلبية.يعني كمية موقعة.كما هو الحال في النظام العشري، يتم تمثيل الحجم بالكمية الموجبة.تستخدم البنية امتداد الإشارة للحفاظ على الكمية عند الترقية إلى سجل [] مع المزيد من البتات:

       [0101]=[00101]=[00000000000101]=5 (base 10)
       [1011]=[11011]=[11111111111011]=-5(base 10)

كفعل:تكملة 2 يعني لنفي.وهذا لا يعني جعل السلبية.يعني إذا كان سلبيًا اجعله إيجابيًا؛إذا كانت إيجابية تجعل سلبية.الحجم هو القيمة المطلقة:

        if a >= 0 then |a| = a
        if a < 0 then |a| = -a = 2scomplement of a

تسمح هذه القدرة بالطرح الثنائي الفعال باستخدام النفي ثم الإضافة.أ - ب = أ + (-ب)

الطريقة الرسمية للحصول على تكملة الرقم 1 هي أن يطرح كل رقم قيمته من 1.

        1'scomp(0101) = 1010.

وهذا هو نفس التقليب أو قلب كل قطعة على حدة.يؤدي هذا إلى صفر سالب وهو أمر غير محبوب، لذا فإن إضافة واحد إلى مكمل te 1 يتخلص من المشكلة.لنفي أو أخذ المكمل 2s أولاً، خذ المكمل 1s ثم أضف 1.

        Example 1                             Example 2
         0101  --original number              1101
         1's comp  1010                       0010
         add 1     0001                       0001
         2's comp  1011  --negated number     0011

في الأمثلة، يعمل النفي أيضًا مع الإشارة إلى الأعداد الممتدة.

إضافة:
1110 Carry 111110 Carry 0110 هو نفس 000110 1111 111111 SUM 0101 SUM 000101

الطرح:

    1110  Carry                      00000   Carry
     0110          is the same as     00110
    -0111                            +11001
  ----------                        ----------
sum  0101                       sum   11111

لاحظ أنه عند العمل باستخدام مكمل الرقم 2، يتم ملء المساحة الفارغة الموجودة على يسار الرقم بالأصفار للأرقام الموجبة ولكن يتم ملؤها بآحاد للأرقام السالبة.تتم إضافة قيمة الحمل دائمًا ويجب أن تكون إما 1 أو 0.

هتافات

مرجع: https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html

أنا عكس كل البتات وأضيف 1.برمجياً:

  // in C++11
  int _powers[] = {
      1,
      2,
      4,
      8,
      16,
      32,
      64,
      128
  };

  int value=3;
  int n_bits=4;
  int twos_complement = (value ^ ( _powers[n_bits]-1)) + 1;

تكملة 2 لعدد معين هو لا.حصلت على إضافة 1 مع تكملة الرقم 1.لنفترض أن لدينا رقمًا ثنائيًا:10111001101 إنه مكمل 1:01000110010 وسيكون تكملة 2:01000110011

إن استكمال رقم ما بطريقة البت يعني قلب جميع البتات الموجودة فيه.ولتكملة ذلك، نقلب كل القطع ونضيف واحدة.

باستخدام تمثيل تكملة 2 للأعداد الصحيحة الموقعة، نطبق عملية تكملة 2 لتحويل رقم موجب إلى مكافئه السلبي والعكس صحيح.لذلك باستخدام القضم على سبيل المثال، 0001 (١) يصبح 1111 (-1) وتطبيق المرجع مرة أخرى، يعود إلى 0001.

يعتبر سلوك العملية عند الصفر مفيدًا في إعطاء تمثيل واحد للصفر دون معالجة خاصة للأصفار الموجبة والسالبة. 0000 يكمل ل 1111, ، والتي عند إضافة 1.يفيض الى 0000, ، مما يعطينا صفرًا واحدًا، بدلًا من واحد موجب وسالب.

الميزة الرئيسية لهذا التمثيل هي أن دوائر الإضافة القياسية للأعداد الصحيحة غير الموقعة تنتج نتائج صحيحة عند تطبيقها عليها.على سبيل المثال إضافة 1 و -1 في القضم: 0001 + 1111, ، تفيض البتات من السجل، تاركة وراءها 0000.

للحصول على مقدمة لطيفة، قام محب الكمبيوتر الرائع بإنتاج ملف فيديو حول هذا الموضوع.

إن تكملة الرقم 2 هي في الأساس طريقة للتوصل إلى المعكوس الجمعي للرقم الثنائي.اسأل نفسك هذا:عند إعطاء رقم في شكل ثنائي، ما هو نمط البت الذي يجعل النتيجة صفرًا عند إضافته إلى الرقم الأصلي؟إذا تمكنت من التوصل إلى نمط البت هذا، فإن نمط البت هذا هو تمثيل -ve (المعكوس الإضافي) للرقم الأصلي؛كما هو الحال بحكم التعريف، فإن إضافة رقم إلى معكوسه الإضافي يجب أن يؤدي دائمًا إلى الصفر.مثال:خذ 101، وهو عدد عشري 5.المهمة الآن هي التوصل إلى نمط البت الذي عند إضافته إلى نمط البت المحدد (101) سينتج عنه صفر.للقيام بذلك، ابدأ من أقصى اليمين من 101 ولكل بت على حدة، اطرح نفس السؤال مرة أخرى:ما البت الذي يجب أن أضيفه إلى "هذا" لجعل النتيجة صفرًا؟استمر في القيام بذلك مع الأخذ في الاعتبار الترحيل المعتاد.بعد أن ننتهي من تحديد الأرقام الثلاثة الصحيحة في معظم الأماكن (الأرقام التي تحدد الرقم الأصلي بغض النظر عن الأصفار البادئة)، فإن الترحيل الأخير يذهب في نمط البت للمعكوس الإضافي.علاوة على ذلك، بما أننا يمكن أن نحتفظ بالرقم الأصلي في بايت واحد على سبيل المثال، فإن جميع البتات البادئة الأخرى في المعكوس الإضافي يجب أن تكون أيضًا 1 بحيث عندما يضيف الكمبيوتر الرقم ومعكوسه الإضافي باستخدام نوع التخزين "ذلك" (char) ستكون النتيجة في هذا الحرف هي جميع الأصفار.

 1 1 1
 ----------
   1 0 1
 1 0 1 1 ---> additive inverse
  ---------
   0 0 0

يمكنك أيضًا استخدام الآلة الحاسبة عبر الإنترنت لحساب التمثيل الثنائي المكمل للرقم العشري: http://www.convertforfree.com/twos-comlement-calculator/

أبسط إجابة:

1111 + 1 = (1)0000.لذلك يجب أن يكون 1111 -1.ثم -1 + 1 = 0.

من المثالي أن أفهم كل هذا بالنسبة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top