0Pricing
C++ Academy · درس

الحدود الرقمية وسلوك تجاوز السعة

استعلم عن std::numeric_limits وافهم قواعد تجاوز السعة للأنواع الموقّعة وغير الموقّعة.

الحدود الرقمية وسلوك تجاوز السعة درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

لماذا تهم الحدود؟

لكل نوع عددي قيمة قصوى ودنيا يمكن تمثيلها. وقد يؤدي تجاوز هذه الحدود إلى نتائج خاطئة دون تنبيه، أو إلى سلوك غير معرّف.

std::numeric_limits

استعلم عن حدود أي نوع عددي باستخدام الترويسة <limits>. هذه ثوابت وقت الترجمة، ولا تترتب عليها أي تكلفة وقت التشغيل.

#include <limits>
std::cout << std::numeric_limits<int>::max() << "\n";
std::cout << std::numeric_limits<int>::min() << "\n";
std::cout << std::numeric_limits<double>::epsilon();

الاستعلامات الشائعة

أكثر الأعضاء استخدامًا:

  • max() — أكبر قيمة
  • min() — أصغر قيمة موجبة
  • lowest() — القيمة الأكثر سلبية
  • epsilon() — أصغر فرق ذي معنى (للأعداد العائمة)
  • digits10 — عدد المنازل العشرية المضمونة

تجاوز سعة الأعداد الصحيحة الموقعة

يُعد تجاوز سعة الأعداد الصحيحة الموقعة سلوكًا غير معرّف. وقد يفترض المصرّف عدم حدوثه مطلقًا، مما يؤدي إلى تحسينات مفاجئة.

int x = std::numeric_limits<int>::max();
x += 1;   // UB — anything can happen

التفاف الأعداد الصحيحة غير الموقعة

تجاوز سعة الأعداد غير الموقعة محدد السلوك؛ إذ تلتف القيم حول نفسها وفق باقي القسمة على 2^N. قد يكون ذلك مفيدًا أحيانًا، لكنه غالبًا ما يؤدي إلى أخطاء يصعب اكتشافها.

unsigned int u = 0;
u -= 1;   // wraps to 4,294,967,295 (UINT_MAX)

تجاوز سعة أعداد الفاصلة العائمة ونقصها

تتحول أعداد الفاصلة العائمة عند تجاوز سعتها إلى inf بدلًا من التسبب في انهيار البرنامج. أما النقص فيؤدي إلى أعداد شبه طبيعية أو إلى 0.

double x = 1e308;
x *= 100;
std::cout << x;  // inf

اكتشاف تجاوز السعة بأمان

بالنسبة إلى الأعداد الصحيحة الموقعة، تحقق قبل تنفيذ العملية. توفر المصرّفات دوال مساعدة مضمّنة للحسابات مع التحقق من التجاوز، مثل __builtin_add_overflow في GCC وClang.

if (a > std::numeric_limits<int>::max() - b) {
    // overflow would happen
}
int sum = a + b;

C++20: ‏std::ssize وstd::cmp_less

تضيف C++20 دوالًا مساعدة للمقارنة الآمنة بين الأعداد الصحيحة في <utility>، وهي std::cmp_equal وcmp_less وcmp_greater. وتتعامل مع المزج بين الأنواع الموقعة وغير الموقعة بطريقة صحيحة.

التحويلات الضمنية مخادعة

يؤدي المزج بين القيم الموقعة وغير الموقعة في مقارنة إلى تحويل المعامل الموقّع بصمت إلى نوع غير موقّع، وهذا مصدر شائع للأخطاء الدقيقة.

int a = -1;
unsigned int b = 1;
if (a < b) std::cout << "yes";
else       std::cout << "no";   // prints "no"!

فحوصات وقت الترجمة

استخدم static_assert لفرض افتراضات الحجم عند كتابة تعليمات برمجية محمولة.

static_assert(sizeof(int) >= 4, "Need at least 32-bit int");

تساعد أدوات Sanitizer في الاختبار

أنشئ البرنامج باستخدام -fsanitize=undefined لاكتشاف تجاوز سعة الأعداد الصحيحة الموقعة أثناء الاختبار.

g++ -fsanitize=undefined -O1 main.cpp

اختبار سريع

ماذا يحدث عند تجاوز سعة عملية جمع لعدد صحيح موقّع في C++؟

مراجعة

استخدم std::numeric_limits للاستعلام عن حدود الأنواع. تجاوز سعة الأعداد الموقعة سلوك غير معرّف، بينما تلتف الأعداد غير الموقعة. احذر عند المزج بين الأنواع الموقعة وغير الموقعة. تساعد أدوات Sanitizer والمقارنات الآمنة في C++20 على حماية تعليماتك البرمجية.

الأسئلة الشائعة

هل درس «الحدود الرقمية وسلوك تجاوز السعة» مجاني؟

نعم — نص درس «الحدود الرقمية وسلوك تجاوز السعة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «الحدود الرقمية وسلوك تجاوز السعة»؟

استعلم عن std::numeric_limits وافهم قواعد تجاوز السعة للأنواع الموقّعة وغير الموقّعة. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «الحدود الرقمية وسلوك تجاوز السعة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الأنواع الصحيحة مقابل أنواع الفاصلة العائمة
  2. الترويسة cmath: ‏pow وsqrt وabs وround
  3. الأعداد العشوائية باستخدام الترويسة random
  4. الحدود الرقمية وسلوك تجاوز السعة
← العودة إلى C++ Academy