شرح - in binary



لماذا تفضل مكملان على التوقيع والحجم للأرقام الموقعة؟ (12)

إجابة واحدة مرضية عن السبب في استخدام تكملة Two2's لتمثيل الأرقام السالبة بدلاً من نظام One's Complement هو أن نظام Two's Complement يحل مشكلة التمثيل المتعدد لـ 0 والحاجة إلى end-around-carry التي توجد في نظام تكملة الشخص لتمثيل سلبي أعداد.

لمزيد من المعلومات ، تفضل بزيارة https://en.wikipedia.org/wiki/Signed_number_representations

في نهاية الزيارة ، تفضل بزيارة https://en.wikipedia.org/wiki/End-around_carry

https://src-bin.com

أنا فقط أشعر بالفضول إذا كان هناك سبب لماذا من أجل تمثيل -1 في ثنائي ، يتم استخدام مكملتين: تقليب البتات وإضافة 1؟

-1 يمثلها 11111111 (مكملان) بدلاً من (بالنسبة لي أكثر بديهية) 10000001 وهو ثنائي 1 مع أول بعلامة سالبة.

إخلاء المسؤولية: لا أعتمد على الحساب الثنائي لعملي!


Answer #1

إن الميزة الرئيسية للتمثيل المتمم لمثنتين والتي لم يتم ذكرها هنا هي أن البتات الأقل لمجموعتين أو فاصلين أو منتج مكمل لا يعتمدان إلا على البتات المقابلة من المعاملات. والسبب في أن القيمة الموقعة 8 بت لـ 1 هي 11111111 هي طرح أي عدد صحيح يكون أقل 8 بتات له هو 00000001 من أي عدد صحيح آخر ، حيث أن أقل 8 بتات هي 0000000 ستنتج عددًا صحيحًا يكون أقل 8 بتات هو 11111111 . رياضيا ، ستكون القيمة -1 سلسة لا نهائية من 1 ، ولكن كل القيم داخل نطاق نوع صحيح معين ستكون إما 1 أو كل 0 في الماضي نقطة معينة ، لذلك فمن الملائم لأجهزة الكمبيوتر أن "تسجيل-تمديد" الأكثر أهمية من عدد كما لو أنها تمثل عدد لانهائي من 1 أو 0's.

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

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


Answer #2

تجدر الإشارة إلى أنه في بعض أجهزة الإضافة المبكرة ، قبل أيام أجهزة الكمبيوتر الرقمية ، سيتم إجراء الطرح من خلال إدخال المشغل للقيم باستخدام مجموعة ألوان مختلفة من الأساطير على كل مفتاح (بحيث يدخل كل مفتاح تسعة ناقص الرقم المراد قراءته مطروح) ، والضغط على زر خاص من شأنه أن يفترض حملها إلى حساب. وهكذا ، على جهاز مكوّن من ستة أرقام ، لطرح 1234 من قيمة ، يقوم المشغل بضرب المفاتيح التي تشير عادة إلى "998،765" وضرب زرًا لإضافة هذه القيمة بالإضافة إلى واحدة إلى الحساب الجاري. إن الحساب المكمّل للثاني هو ببساطة المعادل الثنائي لذلك الحساب "ten's-complement" الأسبق.


Answer #3

تكمل اثنين يسمح بإضافة الأرقام السلبية والإيجابية معا دون أي منطق خاص.

إذا حاولت إضافة 1 و -1 باستخدام الطريقة الخاصة بك
10000001 (-1)
+00000001 (1)
لقد حصلت
10000010 (-2)

وبدلاً من ذلك ، وباستخدام مكملتين ، يمكننا أن نضيف

11111111 (-1)
+00000001 (1) تحصل عليه
00000000 (0)

وينطبق الشيء نفسه على الطرح.

أيضًا ، إذا حاولت طرح 4 من 6 (رقمان موجبان) ، فيمكنك إضافة 2 إلى 4 وإضافة الاثنين معاً 6 + (-4) = 6 - 4 = 2

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


Answer #4

على الرغم من أن هذا السؤال قديم ، اسمحوا لي أن أضع في بلدي 2 سنت.

قبل أن أشرح هذا ، دعنا نعود إلى الأساسيات. 2 'مكمل هو مكمل 1 + 1. الآن ما هو مكمل 1 وما هي أهميته بالإضافة إلى ذلك.

يمنحك مجموع أي عدد n بت ومكمّل 1 الخاص به أعلى رقم ممكن يمكن تمثيله بتلك البتات n. مثال:

 0010 (2 in 4 bit system)
+1101 (1's complement of 2)
___________________________
 1111  (the highest number that we can represent by 4 bits)

الآن ما الذي سيحدث إذا حاولنا إضافة 1 إلى النتيجة. وسوف يؤدي إلى فيضان.

ستكون النتيجة 1 0000 وهي 0 (لأننا نعمل مع 4 بت أرقام ، (1 على اليسار هو تجاوز)

وبالتالي ،

Any n-bit number + its 1's complement = max n-bit number
Any n-bit number + its 1'complement + 1 = 0 ( as explained above, overflow will occur as we are adding 1 to max n-bit number)

قرر أحدهم بعد ذلك الاتصال بـ 1's +1 + 1 as 2'complement. وبالتالي يصبح البيان أعلاه: أي رقم n'bit + مكمله 2 = 0 وهو ما يعني مكمل 2 من رقم = - (من هذا العدد)

كل هذا ينتج سؤالًا واحدًا آخر ، فلماذا نستخدم فقط (n-1) من البتات n لتمثيل العدد الموجب ولماذا يمثل الجزء السفلي من معظم البتات nth (0 على الجزء الأيسر يعني + رقم ve ، و 1 يعني عدد -في). على سبيل المثال ، لماذا نستخدم فقط أول 31 بت من int في جافا لتمثيل رقم موجب إذا كانت البتة 32 بت 1 ، رقم ave.

 1100 (lets assume 12 in 4 bit system)
+0100(2's complement of 12)
___________________________

1 0000 (النتيجة هي صفر ، مع حمل واحد يحمل)

وبالتالي فإن نظام (n + 2'complement of n) = 0 ، لا يزال يعمل. الغموض الوحيد هنا هو مكمل 2 من 12 هو 0100 الذي يمثل أيضا غامضة +8 ، بخلاف يمثل -12 في نظام مكمل 2s.

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


Answer #5

قراءة الإجابات على هذا السؤال ، لقد صادفت هذا التعليق [تحرير].

2 مكمل من 0100 (4) سيكون 1100. الآن 1100 هو 12 إذا قلت بشكل طبيعي. لذا ، عندما أقول العادي 1100 ، فهذا يعني أنه 12 ، ولكن عندما أقول 2 مكملة 1100 فمن ثم -4؟ أيضا ، في جافا عندما يتم تخزين 1100 (دعونا نفترض 4 بت في الوقت الحالي) ثم كيف يتم تحديد ما إذا كان +12 أو -4؟ - hagrawal 2 يوليو الساعة 16:53

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

السؤال - كيف يمكن للنظام تحديد كيفية تفسير واحد أو أكثر من وحدات البايت المجاورة؟ على وجه الخصوص ، كيف يمكن للنظام تحديد ما إذا كان تسلسل معين من البايتات هو رقم ثنائي عادي أم رقم 2 مكمل؟

الإجابة - يحدد النظام كيفية تفسير تسلسل البايتات من خلال الأنواع. أنواع تعريف

  • كم بايت لابد من النظر فيها
  • كيف يجب تفسير تلك البايتات

مثال - أدناه نفترض ذلك

  • char 's هي 1 بايت طويلة
  • short هي 2 بايت طويلة
  • int و s float هي 4 بايت

يرجى ملاحظة أن هذه الأحجام خاصة بنظامي. على الرغم من أنها شائعة جدًا ، إلا أنها يمكن أن تختلف عن النظام إلى النظام. إذا كنت مهتمًا بما هو موجود على نظامك ، فاستخدم مشغل sizeof .

بادئ ذي بدء ، نحدد مصفوفة تحتوي على 4 بايت ونقوم بتهيئة كل منها للرقم الثنائي 10111101 ، المقابل للرقم الست عشري BD .

// BD(hexadecimal) = 10111101 (binary)
unsigned char   l_Just4Bytes[ 4 ]   =   { 0xBD, 0xBD, 0xBD, 0xBD };

ثم نقرأ محتوى الصفيف باستخدام أنواع مختلفة.

unsigned char signed char

// 10111101 as a PLAIN BINARY number equals 189
printf( "l_Just4Bytes as unsigned char  -> %hi\n", *( ( unsigned char* )l_Just4Bytes ) );

// 10111101 as a 2'S COMPLEMENT number equals -67
printf( "l_Just4Bytes as signed char    -> %i\n", *( ( signed char* )l_Just4Bytes ) );

unsigned short short

// 1011110110111101 as a PLAIN BINARY number equals 48573
printf( "l_Just4Bytes as unsigned short -> %hu\n", *( ( unsigned short* )l_Just4Bytes ) );

// 1011110110111101 as a 2'S COMPLEMENT number equals -16963
printf( "l_Just4Bytes as short          -> %hi\n", *( ( short* )l_Just4Bytes ) );

unsigned int و int و float

// 10111101101111011011110110111101 as a PLAIN BINARY number equals 3183328701
printf( "l_Just4Bytes as unsigned int   -> %u\n", *( ( unsigned int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a 2'S COMPLEMENT number equals -1111638595
printf( "l_Just4Bytes as int            -> %i\n", *( ( int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a IEEE 754 SINGLE-PRECISION number equals -0.092647
printf( "l_Just4Bytes as float          -> %f\n", *( ( float* )l_Just4Bytes ) );

تبقى 4 بايت في ذاكرة الوصول العشوائي ( l_Just4Bytes[ 0..3 ] ) تبقى نفسها تمامًا. الشيء الوحيد الذي يتغير هو كيف نفسرها.

مرة أخرى ، نخبر النظام بكيفية تفسيرها من خلال الأنواع .

على سبيل المثال ، استخدمنا الأنواع التالية لتفسير محتويات مصفوفة l_Just4Bytes

  • unsigned char : 1 بايت في ثنائي عادي
  • signed char : 1 بايت في مكمل 2
  • unsigned short : 2 بايت في تدوين ثنائي عادي
  • short : 2 بايت في مكمل 2
  • unsigned int : 4 بايت في تدوين ثنائي عادي
  • int : 4 بايت في مكمل 2
  • float : 4 بايت في تدوين الدقة أحادي الدقة لـ IEEE 754

[EDIT] تم تعديل هذه المشاركة بعد التعليق من قبل user4581301. شكرا لأخذ الوقت لإسقاط تلك الخطوط القليلة مفيدة!


Answer #6

ميزة أداء الطرح بالطريقة المتممة هي تقليل الأجهزة
ليست هناك حاجة للدوائر الرقمية المختلفة للجمع والطرح.كما يتم تنفيذ الجمع والطرح من قبل adder فقط.


Answer #7

نقوم بإجراء عملية إضافة فقط لكل من الجمع والطرح. نضيف المعامل الثاني إلى المعامل الأول للإضافة. لطرح يمكننا إضافة تكملة 2 من المعامل الثاني إلى المعامل الأول.

من خلال التمثيل التكميلي 2 لا نحتاج إلى مكونات رقمية منفصلة لطرحها - يتم فقط استخدام الإضافات والمكملات.


Answer #8

يتم استخدام مكملتين لأنه أسهل لتنفيذ في الدوائر ولا يسمح أيضا بصفر سلبي.

إذا كانت هناك x بت ، فستتسع مكملتين من + (2 ^ x / 2 + 1) إلى - (2 ^ x / 2). سيتم تشغيل مكمل واحد من + (2 ^ س / 2) إلى - (2 ^ س / 2) ، ولكن سيسمح بصفر سلبي (0000 يساوي 1000 في نظام مكمل 4 بت 1).


Answer #9

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

لنفترض أن لديك رقمين ، 2 و -1. في طريقة "بديهية" لتمثيل الأعداد ، سيكونون 0010 و 1001 ، على التوالي (أنا ملتزم بحجم 4 بتات). في الطريقة التكميلية ، هم 0010 و 1111 . الآن ، دعنا نقول أنني أريد إضافتهم.

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

  0010
+ 1111
=10001
= 0001 (discard the carry)

0001 هو 1 ، وهي النتيجة المتوقعة لـ "2 + (- 1)".

ولكن في طريقة "بديهية" ، فإن الإضافة أكثر تعقيدًا:

  0010
+ 1001
= 1011

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

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

بالإضافة إلى ذلك ، في طريقة التخزين "بديهية" ، هناك نوعان من الأصفار:

0000  "zero"
1000  "negative zero"

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

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

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

انها مجرد مسألة النظر إلى بتة العلامة من الكلمة الأصغر وتكرارها حتى تقوم بحشو عرض الكلمة الأكبر.

باستخدام طريقتك ، ستحتاج إلى مسح البتة الموجودة ، وهي عملية إضافية بالإضافة إلى الحشو:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

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


Answer #10

Wikipedia يسمح الجمع والطرح أن يتم بالطريقة العادية (مثل الجرح للأرقام غير الموقعة). كما يمنع -0 (طريقة منفصلة لتمثيل 0 والتي لا تساوي 0 مع الطريقة العادية بت بت مقارنة الأرقام).


Answer #11

Wikipedia تقول كل شيء:

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

بعبارة أخرى ، تكون الإضافة هي نفسها ، أو لا يكون الرقم سالبًا.