لماذا يختلف معامل avo في لغات البرمجة المختلفة؟

StackOverflow https://stackoverflow.com/questions/450410

  •  19-08-2019
  •  | 
  •  

سؤال

وبيرل

print 2 % -18;

->

-16

وتى سى ال

puts [expr {2 % -18}]

->

-16

ولكن فبسكريبت

wscript.echo 2 mod -18

->

2

لماذا الفرق؟

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

المحلول

ويكيبيديا الجواب غير مفيدة إلى حد ما هنا.

وملخص قصير هو أن أي عدد صحيح يمكن تعريفها بأنها

وو= QN + ص

وأين كل هذه الرسائل أعداد صحيحة، و

0 <= | ص | <| ن |.

سوف

وتقريبا كل لغة البرمجة تتطلب (أ / ن) * ن + (أ٪ ن) = أ. لذا فإن تعريف معامل فإن ما يقرب من يعتمد دائما على تعريف قسمة عدد صحيح. هناك نوعان من الخيارات لقسمة عدد صحيح من الأرقام السالبة 2 / -18 = 0 أو 2 / -18 = -1. اعتمادا على أي واحد هو الصحيح للغة الخاص بك وسوف تغيير عادة المشغل٪.

وذلك لأن 2 = (-1) * -18 + (-16) و 2 = 0 * -18 + 2.

لبيرل الوضع معقد. صفحة اليدوية يقول: "لاحظ أنه عند استخدام عدد صحيح هو في نطاق"٪ "يتيح لك الوصول مباشرة إلى مشغل معامل كما نفذت بواسطة مترجم C الخاص بك. هذا المشغل هو غير محددة فضلا عن المعاملات السلبية، ولكن سيتم تنفيذ أسرع." لذلك يمكن أن تختار إما خيار بيرل (مثل C) إذا كان استخدام عدد صحيح في نطاق. إذا كان استخدام صحيح ليست في نطاق، دليل يقول "إذا $ ب هو سلبي، ثم $ ل٪ $ b غير $ ناقص أصغر متعددة من $ ب أن ليس أقل من $ سوف (أي أن تكون النتيجة أقل من أو يساوي صفر) ".

نصائح أخرى

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

وتكمن المشكلة في الأمر هو أنه يمكنك تحديد "ما تبقى" أو "معامل" بطرق مختلفة، وقد لغات مختلفة اختار خيارات مختلفة لتنفيذها.

وبعد تقسيم عدد والمقسوم، واحدة منها هو سلبي، لديك طريقتان على الأقل للفصل بينهما في القسمة والباقي، ان هذه القسمة * المقسوم + الباقي = عدد: يمكنك إما الجولة حاصل نحو اللانهاية السالبة، أو نحو الصفر.

والعديد من اللغات مجرد اختيار واحد.

وأنا لا يمكن أن تقاوم لافتا إلى أن العروض اللثغة المشتركة على حد سواء.

والثعبان، بالطبع، يعلم بشكل واضح لك

>>> divmod(2,-18)
(-1, -16)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top