أحمد حايس
الرئيسيةمن أناالدوراتالمدونةالمناهج والباقات
أحمد حايس

دورات عربية متخصصة في التقنية والبرمجة والذكاء الاصطناعي.

المنصة مبنية على الوضوح، التطبيق، والنتيجة النافعة: شرح مرتب يساعدك تفهم الأدوات، تكتب كودًا أفضل، وتستخدم الذكاء الاصطناعي بوعي داخل العمل الحقيقي.

تعلم أسرعوصول مباشر للدورات والمسارات من الموبايل.
تنقل أوضحالروابط الأساسية والدعم في مكان واحد بدون تشتيت.

المنصة

  • الرئيسية
  • من أنا
  • الدورات
  • المناهج والباقات
  • المدونة

الدعم

  • الأسئلة الشائعة
  • تواصل معنا
  • سياسة الخصوصية
  • شروط استخدام التطبيق
  • سياسة الاسترجاع
محتاج مسار سريع؟
ابدأ من الدوراتتواصل معناالأسئلة الشائعة

© 2026 أحمد حايس. جميع الحقوق محفوظة.

الرئيسيةالدوراتالمناهجالمدونةالدخول
البرمجة بالعربي

Integer Overflow: ليه 2147483647 + 1 بيديك رقم سالب؟

مبتدئ٤ يوليو ٢٠٢٦4 دقائق قراءة
Integer Overflow: ليه 2147483647 + 1 بيديك رقم سالب؟

المستوى: مبتدئ — لو عمرك كتبت كود بيجمع أو يضرب أرقام، المقال ده ليك، حتى لو لسه في أول الطريق.

Integer Overflow: ليه 2147483647 + 1 بيديك رقم سالب؟

لو كتبت 2147483647 + 1 في C أو Java وطلع لك -2147483648، ده مش عطل في جهازك. ده سلوك اسمه Integer Overflow. هنا هتفهم ليه بيحصل بمثال بسيط، تجرّبه بنفسك بكود، وتعرف إمتى لازم تاخد بالك منه قبل ما يوقّع نظامك.

شاشة مليئة بأرقام ثنائية 0 و1 خضراء ترمز إلى تمثيل الأعداد الصحيحة في الذاكرة

الفكرة الأول بمثال: عدّاد كيلومترات العربية

تخيّل عدّاد كيلومترات قديم، ميكانيكي، بخمس خانات. أقصى رقم يقدر يوصله هو 99999. لو مشيت كيلومتر واحد زيادة، الخانات كلها بتلفّ وترجع 00000، مش 100000. الخانة السادسة مش موجودة أصلًا، فمفيش مكان يتخزّن فيه الرقم.

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

الشرح العلمي: بِتات ثابتة وبِت للإشارة

النوع int في لغات زي C وJava وGo بياخد 32 بِت في الذاكرة، يعني 4 بايت. من الـ 32 بِت دول، واحد محجوز لإشارة الرقم، والباقي للقيمة. النتيجة إن أكبر رقم موجب تقدر تخزّنه هو 2147483647، وأصغر رقم سالب هو -2147483648.

التمثيل ده اسمه المتمم الثنائي (Two's Complement). لما تبقى كل بِتات القيمة مليانة واحدات وتزوّد 1، الجمع بيقلب بِت الإشارة من 0 لـ 1، فالرقم فجأة بيتفسّر على إنه أصغر رقم سالب. مفيش رسالة خطأ، الحساب بيكمّل بهدوء بقيمة غلط. ده أخطر جزء في الموضوع.

لوحة إلكترونية ورقاقة معالج تمثل تخزين الاعداد الصحيحة في عدد ثابت من البتات

جرّبها بنفسك

في C السلوك ده واضح ومباشر:

C
#include <stdio.h>
int main(void) {
    int x = 2147483647;
    printf("%d\n", x + 1);
    return 0;
}

في بايثون الموضوع مختلف. أعداد بايثون الصحيحة مرنة الحجم، فبتكبر تلقائيًا ومفيش overflow. عشان تشوف السلوك الحقيقي للأنواع الثابتة، استخدم numpy:

Python
import numpy as np

x = np.int32(2147483647)
print(x + np.int32(1))

print(2147483647 + 1)

جرّب الكود ده بنفسك. لو شفت الرقم السالب في نسخة الـ int32 والرقم الكبير في بايثون العادية، يبقى فهمت الـ overflow بعينك.

قصة حقيقية: عدّاد Gangnam Style

سنة 2014، فيديو Gangnam Style على يوتيوب وصل حوالي 2.1 مليار مشاهدة. عند الرقم 2147483647 العدّاد اتكسر. السبب إن يوتيوب كان بيخزّن عدد المشاهدات في عدد صحيح 32-بِت. يوتيوب اضطر يحوّل العدّاد لـ 64-بِت، اللي بيوصل لحوالي 9.2 كوينتيليون. المشكلة مش نظرية، بتوقّع منتجات حقيقية بيستخدمها ملايين.

الـ trade-off: int32 ولا int64؟

الحل المباشر إنك تستخدم عدد 64-بِت (long في Java، int64، BIGINT في قواعد البيانات). بتكسب مدى أكبر بمليارات المرّات. بتخسر إيه؟ الذاكرة. الـ int64 بياخد 8 بايت بدل 4. لو عندك مصفوفة فيها 100 مليون رقم، ده فرق 800 ميجابايت بدل 400 ميجابايت. الافتراض هنا إن قيمك ممكن فعلًا تعدّي 2.1 مليار.

متى لا تشغل بالك

مش كل رقم محتاج قلق. لو المتغير عدّاد صغير محدود، الـ int32 أكتر من كفاية. ولو بتكتب بايثون عادية، الأعداد الصحيحة بتكبر لوحدها فمفيش overflow أصلًا. الخطر بيظهر تحديدًا في الأنواع الثابتة (C، Java، Go، أعمدة INT في الداتابيز) مع قيم بتكبر مع الوقت: فلوس بالقروش، طوابع زمنية بالملي ثانية، عدد مشاهدات، أو معرّفات بتزيد باستمرار.

الخطوة التالية

افتح أقرب كود عندك بيجمع أو يضرب أرقام ممكن تكبر مع الوقت. بصّ على نوع المتغير أو العمود. لو int 32-بِت وفي احتمال يعدّي 2.1 مليار، غيّره لـ 64-بِت أو BIGINT دلوقتي، قبل ما يلفّ في الإنتاج بصمت.

مصادر

  • CWE-190: Integer Overflow or Wraparound — MITRE: https://cwe.mitre.org/data/definitions/190.html
  • Python Numeric Types: https://docs.python.org/3/library/stdtypes.html
  • NumPy scalar types: https://numpy.org/doc/stable/reference/arrays.scalars.html
  • قصة عدّاد Gangnam Style: https://en.wikipedia.org/wiki/Gangnam_Style

هل استفدت من المقال؟

اطّلع على المزيد من المقالات والدروس المجانية من نفس المسار المعرفي.

تصفّح المدونة