حجم الباحث في ج على أبنية مختلفة
-
05-07-2019 - |
سؤال
أنا على علم بأن مواصفات لغة 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
و #ifdef
s) النوع الصحيح لاستخدام محدد الحجم قليلا.يمكنك العمل المطلوبة يحدد لكل منصة تريد دعم مع التعليمات البرمجية C باستخدام CHAR_BIT
و sizeof()
.
الفرع ذي الصلة من c1x مشروع (n1362) هو:
7.18.1.1 الدقيق-عرض عدد أنواع
Typedef اسم
intN_t
يعين صحيح وقعت نوع مع العرضN
, لا الحشو بت و المتمم التمثيل.وهكذا ،int8_t
يدل صحيح وقعت نوع مع عرض بالضبط 8 بت.Typedef اسم
uintN_t
يعين صحيح غير الموقعة نوع مع العرضN
.وهكذا ،uint24_t
يدل صحيح غير الموقعة نوع مع عرض بالضبط 24 بت.هذه الأنواع هي اختيارية.ومع ذلك ، إذا تم تنفيذ توفر عدد صحيح مع أنواع الاعراض من 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 يعالج هذا بالفعل.