سؤال

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

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

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

المحلول

تحسن في الإجابات الأخرى (التي تفترض أن سحر هو 8 بت، لا يضمن المعيار هذا ..). سيكون مثل هذا:

char a[sizeof(double) * CHAR_BIT == 64];

أو

BOOST_STATIC_ASSERT(sizeof(double) * CHAR_BIT == 64);

يمكنك العثور على char_bit المعرفة في <limits.h> أو <climits>.

نصائح أخرى

في C99، يمكنك فقط التحقق مما إذا كان رمز Preprocessor __STDC_IEC_559__ ويعرف. إذا كان كذلك، فأنت مضمون أن double ستكون قيمة 8 بايت ممثلة مع تنسيق IEEE 754 (المعروف أيضا باسم IEC 60559). راجع معيار C99، Annex F. لست متأكدا مما إذا كان هذا الرمز متاحا في C ++، على الرغم من ذلك.

#ifndef __STDC_IEC_559__
#error "Requires IEEE 754 floating point!"
#endif

بدلا من ذلك، يمكنك التحقق من الثوابت المحددة مسبقا __DBL_DIG__ (يجب أن يكون 15)، __DBL_MANT_DIG__ (يجب أن يكون 53)، __DBL_MAX_10_EXP__ (يجب أن يكون 308)، __DBL_MAX_EXP__ (يجب أن يكون 1024)، __DBL_MIN_10_EXP (يجب أن يكون -307)، و __DBL_MIN_EXP__ (يجب أن يكون -1021). يجب أن تكون هذه متاحة في جميع النكهات C و C ++.

يفحص std::numeric_limits< double >::is_iec559 إذا كنت بحاجة إلى معرفة ما إذا كان تنفيذ C ++ يدعم الزوجي القياسي. هذه الضمانات ليس فقط أن إجمالي عدد البتات هو 64، ولكن أيضا حجم وموقف جميع الحقول داخل المزدوج.

لا أعتقد أنك يجب أن تركز على "الحجم الخام" من المزدوج الخاص بك (وهو عادة 80 بت، وليس 64 بت)، ولكن بدلا من دقةها.

بفضل numeric_limits :: Digits10 هذا سهل إلى حد ما.

يمكنك استعمال ال تعزيز التأكيدات الثابتة لفعل هذا. انظر الى استخدام في نطاق مساحة الاسم مثال.

الحل دون زيادة هو تحديد مجموعة مثل ذلك

char a[ 8 == sizeof(double) ];

إذا كان المزدوج ليس 64 بت ثم يشبه الرمز

char a[0];

وهو خطأ في توقيت الترجمة. فقط ضع التعليق المناسب بالقرب من هذه التعليمات.

يرى هذا المشنور لمشكلة مماثلة وتأكيد تجميع تجميع غير دفعة يسمى Ccassert.

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