سؤال

أنا على علم بأن مواصفات لغة C لا تملي على وجه الدقة حجم كل نوع عدد صحيح (على سبيل المثال ، int).

ما أنا أتساءل:هل هناك طريقة في ج (وليس C++) لتحديد نوع عدد صحيح مع حجم معين يضمن أنها سوف تكون هي نفسها عبر أبنية مختلفة?مثل:

typedef int8 <an integer with 8 bits>
typedef int16 <an integer with 16 bits>

أو أي طريقة أخرى من شأنها أن تسمح أجزاء أخرى من البرنامج ليتم تجميعها في مختلف العمارة.

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

المحلول

وما تريده هو <stdint.h>، التي المجمعين التي تتوافق مع معيار C ( "C99") ستنفذ. للأسف، وهذا لا يشمل مايكروسوفت. لحسن الحظ، يوفر مشروع مفتوح المصدر ل<stdint.h> ويندوز، انظر msinttypes .

وهذا سوف يسمح لك لاستخدام int32_t وuint32_t، بالإضافة إلى 8، 16، و 64، وغيرها الكثير.

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

نصائح أخرى

وC99، في stdint.h ، يحدد أنواع مثل int8_t وint16_t.

لا, C القياسية تحدد الحد الأدنى من أحجام جزء لا يتجزأ من أنواع ولكن لا ضمان على أقصى قدر من الأحجام.

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

يمكنك عادة اختيار (مع الإعداد يحدد ، على سبيل المثال ، cc -D_INT16_IS_INT و #ifdefs) النوع الصحيح لاستخدام محدد الحجم قليلا.يمكنك العمل المطلوبة يحدد لكل منصة تريد دعم مع التعليمات البرمجية C باستخدام CHAR_BIT و sizeof().

الفرع ذي الصلة من c1x مشروع (n1362) هو:


7.18.1.1 الدقيق-عرض عدد أنواع

  1. Typedef اسم intN_t يعين صحيح وقعت نوع مع العرض N, لا الحشو بت و المتمم التمثيل.وهكذا ، int8_t يدل صحيح وقعت نوع مع عرض بالضبط 8 بت.

  2. Typedef اسم uintN_t يعين صحيح غير الموقعة نوع مع العرض N.وهكذا ، uint24_t يدل صحيح غير الموقعة نوع مع عرض بالضبط 24 بت.

  3. هذه الأنواع هي اختيارية.ومع ذلك ، إذا تم تنفيذ توفر عدد صحيح مع أنواع الاعراض من 8 ، 16 ، 32 أو 64 بت ، أي الحشو بت ، و (من أجل توقيع أنواع) أن يكون اثنين من تتمة التمثيل ، فإنه يجب تحديد المقابلة typedef الأسماء.


فيما يتعلق باختيار أنواع شيئا من هذا القبيل ينبغي أن يكون كافيا:

#ifdef INT32_IS_SHORT
    typedef short INT32
#endif
#ifdef INT32_IS_INT
    typedef int INT32
#endif
#ifdef INT32_IS_LONG
    typedef long INT32
#endif

وإذا لم قمت بفحص كل منصة مع #ifdef أو نحو ذلك، وأنا أشك في ذلك من الممكن بسهولة. ولكن العديد من المكتبات القيام بالفعل تلك المهمة بالنسبة لك. لMSVC انها __int8، __int16، وج. مكتبة GTK ديها مماثلة typedefs.

وقد ترغب في إلقاء نظرة على pstdint.h . ذلك هو تطبيق المحمولة من stdint.h، ولا تحتاج إلى دعم مترجم C99.

وبقدر ما أعرف، فإن الجواب هو لا. نحن رمز لمنصات مختلفة، ونحن مجرد استخدام typedefs لمنصات محددة باستخدام # إذا / # آخر. على سبيل المثال على Win32: typedef وكثافة العمليات int32؛

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

في الواقع، لا تحتاج لتنفيذ مثل مكتبة لGNU MP يعالج هذا بالفعل.

http://gmplib.org/

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