سؤال

على عكس Java أو C#، يمكن أن تختلف أنواع البيانات البدائية في C ++ في الحجم اعتمادًا على النظام الأساسي. علي سبيل المثال، int ليس مضمونًا ليكون عددًا صحيحًا 32 بت. تحدد بيئات البرمجيات المختلفة أنواع البيانات مثل uint32 أو dword لهذا الغرض ، ولكن يبدو أنه لا يوجد ملف قياسي لتشمل ملف لأنواع البيانات ذات الحجم الثابت.

ما هي الطريقة الموصى بها لتحقيق أقصى قدر من قابلية النقل؟

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

المحلول

لقد وجدت هذا الرأس مفيدًا بشكل خاص:تعزيز cstdint

عادة أفضل من اختراع العجلة الخاصة (التي تتحمل الصيانة والاختبار).

نصائح أخرى

قم بإنشاء ملف رأس يسمى Types.H ، وتحديد جميع الأنواع البدائية ذات الحجم الثابت الذي تحتاجه (Int32 ، UINT32 ، UINT8 ، إلخ). لدعم منصات متعددة ، يمكنك استخدام إما #ifdef's أو احصل على دليل منفصل للتضمين لكل منصة (include_x86 ، include_x86_64 ، include_sparc). في الحالة الأخيرة ، سيكون لديك تكوينات بناء منفصلة لكل منصة ، والتي سيكون لها دليل الحق في تشمل المسار. الطريقة الثانية هي الأفضل ، وفقًا لـ "The C ++ Gotchas" لـ Stephen DeWhurst.

فقط جانبا ، إذا كنت تخطط لتمرير بيانات ثنائية بين منصات مختلفة ، عليك أيضًا أن تقلق بشأن ترتيب البايت.

جزء من معيار C99 كان ملف stdint.h رأس لتوفير هذا النوع من المعلومات. على سبيل المثال ، يحدد نوعًا يسمى UINT32_T. لسوء الحظ ، لا يدعم الكثير من المجمعين stdint.h. أفضل تنفيذ منصة عبر المنصات رأيته من stdint.h هنا: http://www.azillionkeys.com/qed/pstdint.h. يمكنك فقط تضمين ذلك في مشروعك.

إذا كنت تستخدم Boost ، أعتقد أنه يوفر أيضًا شيئًا مكافئًا لرأس stdint.

تحديد نوع (على سبيل المثال int32) في ملف رأس. لكل منصة ، استخدم #IFDEF آخر وتأكد من أن IN32 هو عدد صحيح 32 بت. في كل مكان في التعليمات البرمجية ، استخدم int32 وتأكد من أنه عند تجميع منصات مختلفة ، يمكنك استخدام الحق في تحديد الحق

شيئان:

أولاً ، يوجد ملف رأس يسمى Limits.H يوفر الكثير من المعلومات المحددة من النظام الأساسي المفيدة. سوف يعطي قيم MAX و MIN لنوع int على سبيل المثال. من ذلك ، يمكنك استنتاج مدى حجم int.

يمكنك أيضًا استخدام مشغل SizeOF في وقت التشغيل لهذه الأغراض أيضًا.

آمل أن يساعد هذا . . .

ك

إذا كان اسمه يبدأ بـ اثنين من السطح (__) ، فسيكون نوع البيانات غير قياسي.

__int8 (غير موقعة __int8)

__int16 (غير موقعة __int16)

__int32 (غير موقعة __int32)

__int64 (غير موقعة __int64)

حاول استخدام Boost/Cstdint.hpp

يوجد رأس stdint.h محدده معيار C99 و (أعتقد) بعض البديل أو أي iso c ++. يحدد هذا أنواعًا لطيفة مثل int16_t و uint64_t و etc ... والتي تضمن أن يكون لها حجم وتمثيل محدد. لسوء الحظ ، فإن توافره ليس قياسيًا تمامًا (كان Microsoft على وجه الخصوص عبارة عن مخاوف القدم هنا).

الجواب البسيط هو هذا ، الذي يعمل على كل 32 أو 64 بت بنية قابلة للبايت القابلة للبايت التي أدركها:

  • جميع متغيرات char هي 1 بايت
  • جميع المتغيرات القصيرة هي 2 بايت
  • جميع متغيرات int هي 4 بايت
  • لا تستخدم "طويل" ، وهو حجم غير محدد.
  • يسمح جميع المجمعين المعروفين بدعم من الرياضيات 64 بت تسمح "طويل الطويل" بنوع 64 بت الأصلي.

كن على دراية بأن حوالي 32 مجمعًا لا يملكون نوعًا 64 بت على الإطلاق ، لذا فإن استخدام Long Long سيقتصر على أنظمة 64 بت ومجموعة أصغر من المجمعين (والتي تشمل GCC و MSVC ، لذلك لن يهتم معظم الناس بالأنظمة هذه المشكلة).

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