كيفية اكتشاف الترميزات على أعداد صحيحة موقعة في ج؟

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

سؤال

يسمح معيار ISO C بثلاث طرق ترميز للأعداد الصحيحة الموقعة: تكملة اثنين ، تكملة واحدة وعلامة/حجم.

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

أخطط لحساب هذا وتخزينه في متغير في كل مرة يتم فيها تشغيل البرنامج بحيث لا يجب أن يكون سريعًا بشكل أعمى - أفترض أن الترميز لن يتغير أثناء تشغيل البرنامج :-)

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

المحلول

عليك فقط التحقق من أجزاء الطلب المنخفضة من الثابت -1 مع شيء مثل -1 & 3. هذا يقييم ل

  1. للتوقيع والحجم ،
  2. لمكمل واحد و
  3. لمكمل اثنين.

يجب أن يكون هذا ممكنًا في تعبير ما قبل المعالج بالداخل #if #else بنيات.

نصائح أخرى

يجب أن يكون اكتشاف مكمل المرء بسيطًا جدًا - شيء مثل if (-x == ~x). يجب أن يكون اكتشاف تكملة اثنين أمرًا سهلاً: if (-x == ~x + 1). إذا لم يكن أي من هؤلاء ، فيجب أن يكون علامة/حجم.

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

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

القيام بذلك مع بضع القيم التي تم اختيارها بعناية يجب أن تفعل ما تريد.

أعتقد أنك ستخزن رقمًا سلبيًا ك int الى char صفيف كبير بما يكفي للاحتفاظ بها ومقارنة الصفيف مع التمثيلات المختلفة لمعرفة ذلك.

لكن uhm ... لا ينبغي أن يكون لدى الأعداد الصحيحة غير الموقعة علامة ، أليس كذلك؟

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