long a2 = 100L * 1024 * 1024 * 1024;
في هذه العملية ، على الأقل معامل واحد على الأقل long
. وبالتالي يتم تنفيذ العملية باستخدام دقة 64 بت ، ونتيجة المشغل العددي من النوع long
. يتم توسيع المعامل الآخر غير الطويل إلى الكتابة long
بواسطة الترويج الرقمي ويتم تخزين القيمة الناتجة إلى متغير a2
.
long a1 = 100 * 1024 * 1024 * 1024;
التعبير المستمر عن عدد صحيح عادي ، تم حساب نتيجة التعبير كنوع int
. كانت القيمة المحسوبة كبيرة جدًا بحيث لا تتناسب مع عدد صحيح وبالتالي فاضت ، مما يؤدي إلى 0
ويتم تخزينه ل a1
عامل.
تحرير: كما هو مطلوب في التعليق التالي:
لماذا لا تصبح سلبية؟
لأنه أثناء وجوده حساب عدد صحيح الحساب الثاني يعادل 25 * 2^32
أين ^
لديه معنى القوة و 2^32
قيمة عدد صحيح 0
. ومع ذلك ، لشرح سبب القيمة 0
: في الثنائي:
100 * 1024 * 1024 * 1024 == 25 * 2^32;
Integer.MAX_VALUE = 2 ^ 31 -1 = 0 11111111 11111111 11111111 1111111
Integer.MAX_VALUE + 1 = 2 ^ 31 = 1 00000000 00000000 00000000 0000000
2 ^ 31
هو عدد صحيح سلبي (-2147483648
) كما بتة علامة 1
وبالتالي 2 ^ 32
هو مجرد تكاثر 2
إلى 2 ^ 31
: تحول اليسار وسيصبح جزء الإشارة 0
وبالتالي النتيجة هي 0
.
تفحص ال java language specification: 4.2.2: Integer operation
للتفاصيل.