سؤال

أعلم أن حجم أنواع البيانات المختلفة يمكن أن يتغير اعتمادًا على النظام الذي أقوم به. أستخدم XP 32Bits ، واستخدام مشغل SizeOF () في C ++ ، يبدو أن مزدوجًا طويلًا هو 12 بايت ، ومزدوج هو 8.

ومع ذلك ، فإن معظم المصادر الرئيسية تنص على أن مزدوجة طويلة هي 8 بايت ، وبالتالي فإن النطاق هو نفسه مزدوج.

كيف يكون لدي 12 بايت؟ إذا كان مزدوج طويل هو بالفعل 12 بايت ، ألا يمتد هذا مدى القيمة أيضًا؟ أو يتم استخدام التوقيع الطويل فقط (أرقام المترجم) عندما تتجاوز القيمة نطاق مزدوج ، وبالتالي ، يمتد إلى ما بعد 8 بايت؟

شكرًا لك.

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

المحلول

نقلا عن ويكيبيديا:

في بنية X86 ، تنفذ معظم المجمعين مزدوجًا طويلًا حيث أن نوع الدقة الممتد 80 بت مدعوم من هذا الجهاز (يتم تخزينه أحيانًا على أنه 12 أو 16 بايت للحفاظ على بنية البيانات.

و

قد يستخدم المجمعون أيضًا مزدوجًا طويلًا لتنسيق الدقة الرباعي 128 بت ، والذي يتم تنفيذه حاليًا في البرامج.

بمعنى آخر ، نعم ، أ long double مايو تكون قادرًا على تخزين مجموعة أكبر من القيم من أ double. لكن الأمر متروك تمامًا للمترجم.

نصائح أخرى

للمترجمين الحديثين على X64 ، يستخدم Clang و GCC مزدوج 16 بايت ل long double بينما يستخدم VC ++ مزدوج 8 بايت. بمعنى آخر ، مع Clang و GCC ستحصل على دقة أعلى من الدقة ولكن لـ VC ++ long double هو نفسه double. تدعم وحدات المعالجة المركزية X86 الحديثة هذه الزوجي 16 بايت ، لذلك أعتقد أن Clang و GCC تقومان بالشيء الصحيح وتسمح لك بالوصول إلى قدرة الأجهزة ذات المستوى الأدنى باستخدام بدائل اللغة ذات المستوى الأعلى.

أحجام البايت القياسية للأرقام هي الحد الأدنى المضمون في جميع المنصات. قد تكون أكبر في بعض الأنظمة ، لكنها لن تكون أصغر أبدًا.

بقدر ما تطالب تجربة المبتدئين في البرمجة:

  • استخدم تعويم دوري تطبيع [-1.0 ،+1.0

  • احمل قيمة تطبيع بشكل منفصل مع مزدوج أو مزدوج طويل

  • يقدم تطبيع الضوضاء = الأخطاء الصغيرة = الترددات العالية لقيم المتغيرات

  • من وقت لآخر ، يكون من المفيد التطبيع مع استمرار القيمة المتوسطة بشكل منفصل والحفاظ على ترتيب البيانات (يمكن حفظ ترتيب البيانات الأصلي كناقل للتقليب)

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