سؤال

أنا تصميم لغة، وتحاول أن تقرر ما إذا كان true يجب أن يكون 0x01 أو 0xFF. من الواضح أن جميع القيم غير الصفرية سيتم تحويلها إلى TRUE، لكنني أحاول أن اتخاذ قرار بشأن التمثيل الداخلي الدقيق.

ما هي إيجابيات وسلبيات لكل خيار؟

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

المحلول

0 FALSE لأن المعالج يحتوي على علامة يتم تعيينها عند ضبط السجل على الصفر.

لا يتم تعيين أي إشارات أخرى على أي قيمة أخرى (0x01، 0xFF، إلخ) - ولكن يتم تعيين علامة صفرية على خطأ عندما تكون هناك قيمة غير صفرية في السجل.

لذلك الإجابات هنا تدافع عن تحديد 0 كخطأ وأي شيء آخر صحيح صحيح.

إذا كنت ترغب في "تحديد" القيمة الافتراضية TRUE، فستكون 0x01 أفضل من معظم:

  • يمثل نفس العدد في كل طول البت والوقت
  • يتطلب فقط اختبار بت واحد إذا كنت ترغب في معرفة ما إذا كان الأمر صحيحا، فيجب أن تكون علامة صفر غير متوفرة أو مكلفة للاستخدام
  • لا داعي للقلق بشأن امتداد الإشارة أثناء التحويل إلى أنواع أخرى
  • التعبيرات المنطقية والحسابت تتصرف كما هو

-Adam.

نصائح أخرى

لا يهم، طالما أنه يرضي قواعد التمثيل الخارجي.

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

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

باستخدام -1 لديه ميزة واحدة في لغة مكتوبة ضعيفة - إذا قمت بالفوضاء واستخدام bitwise and المشغل بدلا من المنطقية and مشغل، حالتك ستظل تقيم بشكل صحيح طالما تم تحويل أحد المعاملات إلى تمثيل المنطقي الكنسي. هذا ليس صحيحا إذا كان التمثيل الكنسي 1.

  0xffffffff & 0x00000010 == 0x00000010 (true)
  0xffffffff && 0x00000010 == 0xffffffff (true)

لكن

  0x00000001 & 0x00000010 == 0x00000000 (false)
  0x00000001 && 0x00000010 == 0xffffffff (true)

IMO، إذا كنت تريد التمسك خاطئة= 0x00، يجب عليك استخدام 0x01. 0xFF عادة ما يكون:

  • علامة على أن بعض العملية تفيض

أو

  • علامة خطأ

وفي كلتا الحالتين، ربما يعني خاطئة. وبعد وبالتالي فإن اتفاقية قيمة إرجاع NIX من الملفات التنفيذية، التي صحيح= 0x00، وأي قيمة غير صفرية خاطئة.

-1 أطول للكتابة من 1 ...

في النهاية، لا يهم الأمر منذ 0 هو خطأ وأي شيء آخر صحيح، ولن تقارن أبدا بالتمثيل الدقيق الصحيح.

تحرير، لأولئك التصويت لأسفل، يرجى توضيح السبب. هذه الإجابة هي نفسها في الأساس كما تم تصنيفها حاليا في +19. بحيث يكون الفرق 21 صوتا عن ما هو الحل الأساسي نفسه.

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

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

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

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

أعتقد أن حياتك أبسط مع 0 و 1.

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

من ناحية أخرى، إذا لم تسمح لهذا التحويل التلقائي، فستكون لديك مؤيد: فلن يكون لديك بعض القاعدة التعسفية تماما بلغتك. لن يكون لديك (7 - 4 - 3) == false, ، أو 3 * 4 + 17 == "Hello", ، أو "Hi mom!" == Complex(7, -2).

أعتقد أن طريقة C هي الطريق للذهاب. 0 يعني خطأ، أي شيء آخر يعني صحيح. إذا ذهبت مع تعيين آخر من أجل TRUE، فسيتم تركك مشكلة في وجود قيم غير محددة - ليس صحيحا ولا خطأ.

إذا كانت هذه هي اللغة التي ستكون تجميعها للحصول على مجموعة تعليمية محددة لها دعم خاص لتمثيل معين، فسأخبرك بذلك. ولكن غائبة بأي معلومات إضافية، من أجل التمثيل الداخلي "القياسي"، سأذهب مع -1 (كل 1 في ثنائي). تمتد هذه القيمة بشكل جيد إلى أي حجم المنطقي الذي تريده (قليلا قليلا، 8 بت، 16، إلخ)، وإذا كنت تنفصل "صحيح" أو "خطأ" في "صواب" أو "خطأ" أصغر نفس الشيء. (حيث اخترت حقيقة 16 بت = 0x0001، ستحصل على خطأ = 0x00 و True = 0x01).

تصميم اللغة بحيث يكون 0 غير صفر وغير صفر صحيح. ليست هناك حاجة إلى "تحويل" أي شيء، والتفكير "غير صفرية" بدلا من بعض القيمة المحددة سوف تساعدك على كتابة التعليمات البرمجية بشكل صحيح.

إذا كان لديك رموز مدمجة مثل "True"، فانتقل إلى الأمام واختر قيمة، ولكن أعتقد دائما "صفر صفر" بدلا من "0x01 صحيح".

مهما فعلت، بمجرد تحديد قيمك لا تتغيرها. دخول 77، تم تعريف True و False على أنه 1 و 0.، ظهره 83، على الرغم من إعادة تعريفها على أنها -1 و 0. كانت هناك عدد قليل منها (حسنا، فقط قليلة، هذا هو كل شيء نتحدث عنه) مشاكل الناجمة عن هذا.

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