حساب الأعداد الصحيحة وتجاوز السعة
افهم قسمة الأعداد الصحيحة وباقي القسمة وسلوك تجاوز السعة وكيفية اكتشافه
حساب الأعداد الصحيحة وتجاوز السعة درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
حساب الأعداد الصحيحة وتجاوز السعة
للأعداد الصحيحة في Java أحجام ثابتة. وعندما تتجاوز عملية حسابية القيمة القصوى أو الدنيا، فإنها تلتف بصمت، ولا يُطرح أي استثناء. يساعد فهم ذلك على منع الأخطاء الدقيقة.
مجالات الأعداد الصحيحة
لكل نوع من الأعداد الصحيحة مجال محدود تحدده سعته بالبت:
byte: من -128 إلى 127short: من -32,768 إلى 32,767int: من -2,147,483,648 إلى 2,147,483,647long: من -9.2 × 10^18 إلى 9.2 × 10^18
System.out.println(Integer.MAX_VALUE); // 2147483647
System.out.println(Integer.MIN_VALUE); // -2147483648
System.out.println(Long.MAX_VALUE); // 9223372036854775807
System.out.println(Byte.MAX_VALUE); // 127التجاوز: الالتفاف الصامت
تؤدي إضافة 1 إلى Integer.MAX_VALUE إلى الالتفاف إلى Integer.MIN_VALUE. هذا حساب بالمتمم الثنائي؛ ولا تضمن Java نتيجة أخرى ولا تطرح أي استثناء.
int max = Integer.MAX_VALUE;
System.out.println(max + 1); // -2147483648 (overflow!)
byte b = 127;
b++; // wraps to -128
System.out.println(b); // -128
// Real bug: counting votes in a large election with int
int votes = Integer.MAX_VALUE;
votes += 100; // silently wrong
System.out.println(votes); // negative number!اكتشاف التجاوز باستخدام Math.addExact
قدمت Java 8 فأحدث Math.addExact() وmultiplyExact() وsubtractExact()، وهي تطرح ArithmeticException عند حدوث تجاوز بدلًا من الالتفاف الصامت.
try {
int result = Math.addExact(Integer.MAX_VALUE, 1);
} catch (ArithmeticException e) {
System.out.println("Overflow detected!"); // prints this
}
try {
long safe = Math.multiplyExact(100_000L, 100_000L);
System.out.println(safe); // 10000000000
} catch (ArithmeticException e) {
System.out.println("Multiply overflow");
}قسمة الأعداد الصحيحة وباقي القسمة
تؤدي قسمة الأعداد الصحيحة إلى القطع باتجاه الصفر. ويُرجع العامل % الباقي بالإشارة نفسها التي يحملها المقسوم. انتبه إلى القسمة على الصفر، إذ تطرح ArithmeticException.
System.out.println(10 / 3); // 3 (not 3.33)
System.out.println(10 % 3); // 1
System.out.println(-10 % 3); // -1 (sign follows dividend)
System.out.println(-10 % -3); // -1
try {
int x = 5 / 0; // ArithmeticException: / by zero
} catch (ArithmeticException e) {
System.out.println(e.getMessage()); // / by zero
}
// Float division by zero gives Infinity, not exception
System.out.println(5.0 / 0); // Infinityحساب الأعداد الكبيرة باستخدام long
استخدم long عندما يُحتمل أن تتجاوز القيم مجال int. أضف دائمًا L إلى القيم الحرفية من نوع long لمنع حدوث التجاوز قبل الإسناد.
// Bug: multiplication done as int, then widened
long wrong = 1_000_000 * 1_000_000; // overflows int!
System.out.println(wrong); // -727379968 (wrong!)
// Fix: one operand is long
long correct = 1_000_000L * 1_000_000L;
System.out.println(correct); // 1000000000000
// Or cast first
long alsOk = (long) 1_000_000 * 1_000_000;
System.out.println(alsOk); // 1000000000000عوامل إزاحة البتات
تُعد عوامل إزاحة البتات طرقًا سريعة للضرب أو القسمة على قوى العدد 2:
n << k— إزاحة إلى اليسار: الضرب في 2^kn >> k— إزاحة موقّعة إلى اليمين: القسمة على 2^kn >>> k— إزاحة غير موقّعة إلى اليمين: ملء الخانات بأصفار
int n = 8;
System.out.println(n << 1); // 16 (8 * 2)
System.out.println(n << 2); // 32 (8 * 4)
System.out.println(n >> 1); // 4 (8 / 2)
System.out.println(n >> 2); // 2 (8 / 4)
// Check if number is power of 2
boolean isPow2 = n > 0 && (n & (n - 1)) == 0;
System.out.println(isPow2); // trueو AND وOR وXOR على مستوى البتات
تعمل العوامل على مستوى البتات على البتات الفردية، وتُستخدم في الصلاحيات والعلامات والبروتوكولات منخفضة المستوى.
int a = 0b1010; // 10
int b = 0b1100; // 12
System.out.println(Integer.toBinaryString(a & b)); // 1000 (AND = 8)
System.out.println(Integer.toBinaryString(a | b)); // 1110 (OR = 14)
System.out.println(Integer.toBinaryString(a ^ b)); // 0110 (XOR = 6)
System.out.println(Integer.toBinaryString(~a)); // ...11110101 (NOT)
// Permission flags example
int READ = 0b001;
int WRITE = 0b010;
int EXEC = 0b100;
int perms = READ | WRITE; // user has read+write
System.out.println((perms & EXEC) != 0); // false — no execالشرطات السفلية في القيم الحرفية الرقمية
تسمح Java 7 فأحدث باستخدام الشرطات السفلية في القيم الحرفية الرقمية لتحسين سهولة القراءة. ويتجاهلها المصرّف.
int million = 1_000_000;
long creditCard = 4_111_1111_1111_1111L;
double pi = 3.141_592_653_589_793;
int hex = 0xFF_EC_D1_2E;
int binary = 0b0001_0101_0110;
System.out.println(million); // 1000000
System.out.println(creditCard); // 4111111111111111BigInteger للدقة الاعتباطية
عندما تتجاوز القيم long، استخدم BigInteger. فهو لا يسبب تجاوزًا، لكنه أبطأ من الأنواع البدائية. استخدمه للمفاتيح التشفيرية والمضروبات والأعداد الفلكية.
import java.math.BigInteger;
BigInteger factorial100 = BigInteger.ONE;
for (int i = 2; i <= 100; i++) {
factorial100 = factorial100.multiply(BigInteger.valueOf(i));
}
System.out.println(factorial100.toString().length() + " digits"); // 158 digits
BigInteger a = new BigInteger("999999999999999999999999999999");
BigInteger b = new BigInteger("1");
System.out.println(a.add(b)); // 1000000000000000000000000000000تطبيقي: عدّاد آمن من تجاوز السعة
نمط لتنفيذ عدّاد يتعامل مع تجاوز السعة بأمان، باستخدام Math.addExact والرجوع إلى Long.MAX_VALUE عند حدوثه.
class SafeCounter {
private long count = 0;
public void increment() {
try {
count = Math.addExact(count, 1L);
} catch (ArithmeticException e) {
count = Long.MAX_VALUE; // cap at max
}
}
public long get() { return count; }
}
SafeCounter sc = new SafeCounter();
sc.increment();
sc.increment();
System.out.println(sc.get()); // 2تحقق سريع
ما قيمة التعبير التالي؟
long result = 1_000_000 * 1_000_000; System.out.println(result);
مراجعة: حساب الأعداد الصحيحة وتجاوز السعة
أهم النقاط:
- يلتف تجاوز سعة الأعداد الصحيحة بصمت، ولا يحدث استثناء تلقائيًا
- استخدم Math.addExact/multiplyExact/subtractExact لاكتشاف تجاوز السعة
- تقتطع قسمة الأعداد الصحيحة الجزء العشري باتجاه الصفر؛ وتتبع إشارة % إشارة المقسوم
- استخدم القيم الحرفية من النوع long (اللاحقة L) عندما قد تتجاوز النتائج الوسيطة سعة int
- يتعامل BigInteger مع قيم كبيرة بلا حدود من دون تجاوز السعة
- تُعد معاملات إزاحة البتات بدائل سريعة لضرب أو قسمة القوى العددية للعدد 2
الأسئلة الشائعة
هل درس «حساب الأعداد الصحيحة وتجاوز السعة» مجاني؟
نعم — نص درس «حساب الأعداد الصحيحة وتجاوز السعة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «حساب الأعداد الصحيحة وتجاوز السعة»؟
افهم قسمة الأعداد الصحيحة وباقي القسمة وسلوك تجاوز السعة وكيفية اكتشافه تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «حساب الأعداد الصحيحة وتجاوز السعة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات الفئة Math
- حساب الأعداد الصحيحة وتجاوز السعة
- استخدام BigDecimal في الحسابات المالية
- NumberFormat وprintf