سؤال

هل هناك طريقة للحصول على تعداد 64 بت في C++؟أثناء إعادة هيكلة بعض التعليمات البرمجية، عثرت على مجموعة من #defines والتي ستكون أفضل كتعداد، ولكن كونها أكبر من 32 بت تتسبب في حدوث خطأ في المترجم.

لسبب ما اعتقدت أن ما يلي قد ينجح:

enum MY_ENUM : unsigned __int64  
{  
    LARGE_VALUE = 0x1000000000000000,  
};
هل كانت مفيدة؟

المحلول

لا أعتقد أن هذا ممكن مع C++ 98.التمثيل الأساسي للتعدادات متروك للمترجم.في هذه الحالة، من الأفضل أن تستخدم:

const __int64 LARGE_VALUE = 0x1000000000000000L;

بدءًا من الإصدار C++11، من الممكن استخدام فئات التعداد لتحديد النوع الأساسي للتعداد:

enum class MY_ENUM : unsigned __int64 {
    LARGE_VALUE = 0x1000000000000000ULL
};

بالإضافة إلى ذلك، تقدم فئات التعداد نطاقًا جديدًا للاسم.لذلك بدلا من الإشارة إلى LARGE_VALUE, ، يمكنك الرجوع MY_ENUM::LARGE_VALUE.

نصائح أخرى

يدعم C++ 11 هذا، باستخدام بناء الجملة هذا:

enum class Enum2 : __int64 {Val1, Val2, val3};

المسودة الحالية لما يسمى C++0x, ، إنها n3092 يقول في 7.2 إعلانات التعداد, ، الفقرة 6:

إنه محدد من قبل التنفيذ الذي يتم استخدامه من النوع المتكامل كنوع أساسي باستثناء أن النوع الأساسي يجب ألا يكون أكبر من INT ما لم تكن قيمة العداد لا يمكن أن تتناسب مع int أو int غير موقعة.

وتقول نفس الفقرة أيضًا:

إذا لم يكن هناك أي نوع متكامل يمكن أن يمثل جميع قيم العداد ، فإن التعداد غير مُشكل.

تفسيري للجزء ما لم تكن قيمة العداد لا يمكن احتواؤها في int أو int غير الموقعة هو أنه من الصحيح والآمن تمامًا تهيئة العداد بقيمة عددية 64 بت طالما أن هناك نوع عدد صحيح 64 بت متوفر في تطبيق C++ معين.

على سبيل المثال:

enum MyEnum
{
    Undefined = 0xffffffffffffffffULL
};

الإجابات التي تشير إلى __int64 تفوت المشكلة.التعداد يكون صالح في جميع برامج التحويل البرمجي لـ C++ التي تحتوي على نوع متكامل 64 بت حقيقي، أي.أي مترجم C++ 11، أو مترجم C++ 03 مع الامتدادات المناسبة.ملحقات لC++03 مثل __int64 تعمل بشكل مختلف عبر المترجمين، بما في ذلك مدى ملاءمتها كنوع أساسي للتعدادات.

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

يمكنك إنشاء شيء مثل في عينتك مثل:

namespace MyNamespace {
const uint64 LARGE_VALUE = 0x1000000000000000;
};

واستخدامها تمامًا مثل استخدام التعداد

MyNamespace::LARGE_VALUE 

أو

using MyNamespace;
....
val = LARGE_VALUE;

نظرًا لأنك تعمل بلغة C++، فقد يكون هناك بديل آخر

const __int64 LARVE_VALUE = ...

يمكن تحديد ذلك في ملف H.

مقتطف التعليمات البرمجية الخاص بك ليس معيار c++:

تعداد MY_ENUM :غير موقعة __int64

لا معني له.

استخدم const __int64 بدلاً من ذلك، كما يقترح Torlack

يتم تحديد نوع التعداد عادةً بواسطة نوع بيانات مُهيئ التعداد الأول.إذا كانت القيمة يجب أن تتجاوز النطاق الخاص بنوع البيانات المتكامل، فسوف يتأكد مترجم c++ من ملاءمته باستخدام نوع بيانات متكامل أكبر. إذا وجد المترجم أنه لا ينتمي إلى أي من أنواع البيانات المتكاملة، فسيقوم المترجم بإلقاء خطأ.المرجع: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf
يحرر:لكن هذا يعتمد بشكل كامل على بنية الآلة

يمكن أن يكون التعداد في لغة C++ أي نوع متكامل.يمكنك، على سبيل المثال، الحصول على تعداد من الأحرف.أي:

enum MY_ENUM
{
   CHAR_VALUE = 'c',
};

أود يفترض يتضمن هذا __int64.حاول فقط

enum MY_ENUM
{
   LARGE_VALUE = 0x1000000000000000,
};

وفقًا لمعلقي، المتغيرات المكونة من ستة أحرف، في لغة C، سيكون النوع الأساسي هو int دائمًا، بينما في C++، يكون النوع الأساسي هو كل ما هو كبير بما يكفي ليناسب أكبر قيمة مضمنة.لذلك يجب أن يعمل كلا التعدادين أعلاه.

في MSVC++ يمكنك القيام بذلك:

التعداد MYLONGLONGENUM:__int64 { BIG_KEY=0x3034303232303330, ...};

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