ضمان الزوجي C ++ هي 64 بت
-
09-09-2019 - |
سؤال
في برنامج 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.