سؤال

ما هي أفضل طريقة لإعلان نوع عدد صحيح وهو دائمًا 4 بايت على أي منصات؟ لا تقلق بشأن جهاز معين أو الأجهزة القديمة التي تحتوي على 16 بت int.

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

المحلول

#include <stdint.h>

int32_t my_32bit_int;

نصائح أخرى

C لا يهم نفسه كثيرًا بأحجام دقيقة من أنواع عدد صحيح ، يقدم C99 الرأس stdint.h ، ربما هو أفضل رهان لك. قم بتضمين ذلك ويمكنك استخدام EG int32_t. بالطبع لا تدعم جميع المنصات ذلك.

إن إجابة Corey صحيحة لـ "Best" ، في رأيي ، لكن "int" بسيطة ستعمل أيضًا في الممارسة العملية (بالنظر إلى أنك تتجاهل الأنظمة التي تحتوي على 16 بت). في هذه المرحلة ، يعتمد الكثير من التعليمات البرمجية على INT 32 بت أن بائعي النظام لن يغيروها.

(انظر أيضًا لماذا Long هو 32 بت على الكثير من الأنظمة 64 بت ولماذا لدينا "طويل طويل".).

واحدة من فوائد استخدام int32_T ، على الرغم من أنك لا تديم هذه المشكلة!

يمكنك البحث عن نسخة من براين غلادمان brg_types.h إذا لم يكن لديك stdint.h.

brg_types.h سوف يكتشف أحجام الأعداد الصحيحة المختلفة على النظام الأساسي الخاص بك وسيقوم بإنشاء typedefs للأحجام المشتركة: 8 و 16 و 32 و 64 بت.

تحتاج إلى تضمين inttypes.h بدلاً من stdint.h لان stdint.h غير متوفر على بعض المنصات مثل Solaris ، و inttypes.h سوف يتضمن stdint.h لك على أنظمة مثل Linux. إذا قمت بتضمين inttypes.h ثم الرمز الخاص بك أكثر محمولة بين Linux و Solaris.

يشرح هذا الرابط ما أقوله:رابط HP حول inttypes.h

وهذا الرابط يحتوي على جدول يوضح لماذا لا تريد استخدامه long أو int إذا كان لديك نية لعدد معين من البتات الموجودة في نوع البيانات الخاص بك.رابط IBM حول أنواع البيانات المحمولة

إذا لم يكن stdint.h متاحًا لنظامك ، فابحث عنك. لدي دائمًا ملف يسمى "Types.H" الذي يحتوي على Typedefs لجميع قيم 8 و 16 و 16 و 32 بت.

اعتمادًا أيضًا على المنصات المستهدفة ، يمكنك استخدام Autotools لنظام الإنشاء الخاص بك

سوف يرى ما إذا كانت stdint.h/inttypes.h موجودة وإذا لم تنشئ typedefs المناسبة في "config.h"

stdint.h هو الخيار الواضح ، لكنه ليس متاحًا بالضرورة.

إذا كنت تستخدم مكتبة محمولة ، فمن المحتمل أنها توفر بالفعل أعداد صحيحة ذات عرض ثابت محمول. على سبيل المثال ، SDL لديه Sint32 (S من أجل "موقعة") ، و Glib لديه gint32.

C99 أو أحدث

يستخدم <stdint.h>.

إذا كان التنفيذ يدعم الأعداد الصحيحة المكملة 22 بت ، فيجب تحديده int32_t.

إذا لم يكن الأمر كذلك ، فإن أفضل شيء التالي هو int_least32_t وهو نوع عدد صحيح يدعمه التنفيذ الذي لا يقل عن 32 بت ، بغض النظر عن التمثيل (تكملة اثنين ، تكملة المرء ، إلخ).

يوجد ايضا int_fast32_t وهو نوع عدد صحيح لا يقل عن 32 بت ، يتم اختياره بقصد السماح بأسرع العمليات لمتطلبات الحجم هذا.

أنسي ج

يمكنك استخدام long, ، والتي تضمن أن تكون بعرض 32 بت على الأقل نتيجة لمتطلبات الحد الأدنى للنطاق المحدد وفقًا للمعيار.

إذا كنت تفضل استخدام أصغر نوع عدد صحيح لتناسب رقم 32 بت ، فيمكنك استخدام عبارات ما قبل المعالج مثل ما يلي مع وحدات الماكرو المحددة في <limits.h>:

#define TARGET_MAX 2147483647L

#if   SCHAR_MAX >= TARGET_MAX
  typedef signed char int32;
#elif SHORT_MAX >= TARGET_MAX
  typedef short int32;
#elif INT_MAX   >= TARGET_MAX
  typedef int int32;
#else
  typedef long int32;
#endif

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