سؤال

يبدو أنه عند كتابة رقم في Java، يقوم برنامج التحويل البرمجي تلقائيا بقراءة ذلك كعدد صحيح، ولهذا السبب عند كتابة (طويلة) 6000000000 (ليس في نطاق عدد صحيح) سوف يشكو من ذلك 6000000000 ليس عددا صحيحا. لتصحيح هذا، كان علي تحديد 6000000000L. وبعد لقد تعلمت للتو عن هذه المواصفات.

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

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

المحلول

هناك لاحقات محددة ل long (على سبيل المثال 39832L), float (على سبيل المثال 2.4f) و double (على سبيل المثال -7.832d).

إذا لم يكن هناك لاحقة، فهو نوع غير متكامل (على سبيل المثال 5623)، من المفترض أن يكون int. وبعد إذا لم يكن نوعا لا يتجزأ (على سبيل المثال 3.14159)، من المفترض أن يكون double.

في جميع الحالات الأخرى (byte, short, char)، تحتاج إلى إيصال كما لا يوجد لاحقة محددة.

يتيح Java Spec من اللواحق العلوية والسفلية، ولكن إصدار الحالة العليا ل longS هو المفضل، كما الحالة العليا L أقل سهولة في الخلط بين عدد 1 من القضية الصغيرة l.

انظر JLS القسم 3.10. للحصول على تفاصيل Gory (انظر تعريف IntegerTypeSuffix).

نصائح أخرى

آمل أن لا تمانع في الظل الطفيف، لكنني أعتقد أنك قد تكون مهتما بمعرفة ذلك إلى جانب ذلك F (للطفو)، D (للمضاعف)، و L (لفترة طويلة)، تم تقديم اقتراح لإضافة لاحقات ل byte و shortY و S على التوالى. من شأن هذا القضاء على الحاجة إلى الإدلاء على البايتات عند استخدام بناء الجملة الحرفي لصفيفات البايت (أو القصيرة). نقلا عن مثال من الاقتراح:

الفائدة الرئيسية: لماذا تكون المنصة أفضل إذا تم اعتماد الاقتراح؟

كود كرودي مثل

 byte[] stuff = { 0x00, 0x7F, (byte)0x80,  (byte)0xFF};

يمكن ترميزها كما

 byte[] ufum7 = { 0x00y, 0x7Fy, 0x80y, 0xFFy };

جو دارسي يشرف على عملة المشروع ل Java 7، و مدونته لقد كانت طريقة سهلة لتتبع هذه المقترحات.

هذه هي حرفي ويتم وصفها في القسم 3.10. من مواصفات لغة جافا.

بشكل افتراضي، سيتم التعامل مع أي نوع بيانات بدائي متكاملة (بايت، قصيرة، كثيفة، طويلة) إتجاه اكتب بواسطة جافا مترجم. بالنسبة بايت و قصيرة, ، طالما أن القيمة المعينة لهم في نطاقها، فلا توجد مشكلة ولا لاحقة مطلوبة. إذا كانت القيمة المعينة ل بايت و قصيرة يتجاوز نطاقهم، يلزم صب النوع الصريح.

السابق:

byte b = 130; // CE: range is exceeding.

للتغلب على هذا أداء نوع الصب.

byte b = (byte)130; //valid, but chances of losing data is there.

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

Long l = 2147483647; //which is max value of int

في هذه الحالة لا لاحقة مثل L / L مطلوب. بشكل افتراضي القيمة الافتراضية 2147483647 يعتبر مترجم Java Compiler هو نوع INT. تتم صب النوع الداخلي بواسطة برنامج التحويل البرمجي والإنكتات يتم ترقيته تلقائيا إلى نوع طويل.

Long l = 2147483648; //CE: value is treated as int but out of range 

هنا نحتاج إلى وضع لاحقة كإجراء لعلاج الحرفي 2147483648 طالما نوع مترجم جافا.

حتى النهاية

Long l = 2147483648L;// works fine.

يبدو أن هذه ستكون من الجيد أن يكون ذلك لأن (أفترض) إذا كنت تستطيع تحديد الرقم الذي تكتبه هو قصير ثم لن تضطر Java إلى إلقاءها

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

انصح:

long l = -1 >>> 1;

عكس

int a = -1;
long l = a >>> 1;

الآن كنت تتوقع أن تهتم شظايا رمز لإعطاء نفس القيمة للمتغير l. وبعد لذلك نحن بحاجة إلى التعبير على int الحرفية التي يتعين القيام بها كما intس.

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