الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Byte & Int Vars Overflow ?

مغلق
بدأه bassamBST في 25 أغسطس 2007 · 12 رد · 1,202 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ما سبب السلوك المختلف لمترجم اللغة عندما يحصل overflow لمتحول فيما اذا كان int او byte مثلاً.. ؟؟

public class Overflow {
  public static void main(String[] args) {
	int big = 0x7fffffff; // max int value
	System.out.println("big = " + big);
	int bigger = big * 4;
	System.out.println("bigger = " + bigger);
  }
}

الخرج:

big = 2147483647
bigger = -4

بينما في حال كون النمط byte

	public static void main(String[] args) {
		byte big = 0x7f; // max byte value
		System.out.println("big = " + big);
		byte bigger = big * 4;
		System.out.println("bigger = " + bigger);
}

يعترض المترجم ولا تتم الترجمة

possible loss of precision: int, required: byte

؟؟؟؟

#2

السلام عليكم

اسأحاول ان افيدك من خلا البدء بالكود الثاني ، حيث انك اسندت قيمة من نوع float الى متغير

من نوع byte و هذا الامر غير صحيح بالنسبة للمترجم و ذلك من خلال الامر :

byte big = 0x7f

حيث ان اضافة الحرف f الى اخر الرقم تعني للمترجم ان هذه القيمة من نوع flaot ...

و القاعده هنا انك لا تسنطيع ادخال قيمة من نوع كبير (و التي هي هنا flaot) الى قيمة من نوع صغير

(و الذي هو هنا byte) الامر الذي هو منطقي اذا فكرنا بحجم كل نوع في الذاكره .... بينما في الكود

الاول كان الاسناد بنت قيم متكافئة في الحجم و هي الـ flaotو الـ int ...

و من اجل ذلك ظهرت مع رسالى الخطأ :

possible loss of precision: int, required: byte

و التي تعني ان هناك احتمالية لخشارة في دقة العدد ...

و الله اعلى و اعلم :)

بنت اليمن ...

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#3
اقتباس
السلام عليكم

اسأحاول ان افيدك من خلا البدء بالكود الثاني ، حيث انك اسندت قيمة من نوع float الى متغير

من نوع byte و هذا الامر غير صحيح بالنسبة للمترجم و ذلك من خلال الامر :

byte big = 0x7f

حيث ان اضافة الحرف f الى اخر الرقم تعني للمترجم ان هذه القيمة من نوع flaot ...

و القاعده هنا انك لا تسنطيع ادخال قيمة من نوع كبير (و التي هي هنا flaot) الى قيمة من نوع صغير

(و الذي هو هنا byte) الامر الذي هو منطقي اذا فكرنا بحجم كل نوع في الذاكره .... بينما في الكود

الاول كان الاسناد بنت قيم متكافئة في الحجم و هي الـ flaotو الـ int ...

و من اجل ذلك ظهرت مع رسالى الخطأ :

possible loss of precision: int, required: byte

و التي تعني ان هناك احتمالية لخشارة في دقة العدد ...

و الله اعلى و اعلم

بنت اليمن ...

وعليكم السلام

للأسف هذا غير صحيح

انا استخدمت Integral Literal للتعبير عن العدد 127 بالنظام الست العشري Hexadecimal

هنا انتبهي للـ prefix

0x

فالـ f هنا ليست suffix

-_-

جربي مثلاً

byte x = 0xf;

لتتأكدي ان المترجم لن يعترض للسبب الذي قمتي بتوضيحه..

شكراً على محاولة المساعدة..

تم تعديل هذه المشاركة بواسطة bassamBST في 25 أغسطس 2007 في 23:06

#4

لاحظ معي يا أخي أنك تقوم بعملية ضرب في أربعة

يعلم لدى الجميع أن البايت 8 بت

لاحظ معي أن الرقم الذي اختارته يمثل بالنظام الثنائي كالتالي 01111111

عندما تضرب العدد السابق في 2 يصبح 011111110 وسيخزن كالتالي 11111110 لا مشاكل لأنك تخيلت عن صفر

سنضرب مرة في 2 فنصبح ضربنا في أربعة سنحصل على العدد 111111100 وسيخزن كالتالي 11111100

نلاحظ أننا فقدنا 1 وذلك يعني أن الناتج غير صحيح

لذلك اعترض المترجم واخرج لك رسالة الخطأ السابقة

أرجو أن تكون الفكرة وصلت

الله معك

تم تعديل هذه المشاركة بواسطة alaadiaa في 26 أغسطس 2007 في 03:29

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#5

انت وين وانا وين ؟؟؟

اقرأ السؤال جيداً قبل الاجابة وتكبد عناء 8 اسطر

السؤال هو

سبب قيام مترجم Java بالاعتراض على الـ Overflow الذي يطرأ على متحول byte

بينما تتم عملية الترجمة والتنفيذ (بدون exceptions) في حال الـ Overflow لمتحولات الـ int ????

الله معك!

#6

لا عليك يبدو أني بدأت أخرف كثيراً

لكني أظن أن هناك أسلوب أرقى للتعبير عن خطئي في الرد عليك

لقد حسبت لوهلة أني أسأل سؤالاً غبياً وأنك أستاذ تهزئ من غبائي

راجع نفسك في هذا الموضوع فلو أني علمت أن سألقى رداً كردك الرائع ما فكرت مجرد التفكير في مساعدة أحد

على العموم لا أعلم كيف لم تحصل على خطأ في الترجمة

لهذه الجملة

byte bigger = big * 4;

يبدو أنك تستخدم jdk قديم

لأن صن على ما يبدو قد منعت إجراء العمليات علىByte مباشرة ومن ذلك عملية الضرب والقسمة وحتى التحريك إلى اليسار وإلى اليمين

وقصرتها على الأنواع الأخرى

لأني حصلت على الخطأ التالي

Type mismatch: cannot convert from int to byte

على الجملة السابقة

فاضررت إلى كتابة التالي

byte bigger = (byte)(big *4);

الله معك

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#7
alaadiaa كتب:
على العموم لا أعلم كيف لم تحصل على خطأ في الترجمة

لهذه الجملة

byte bigger = big * 4;

يبدو أنك تستخدم jdk قديم

من قال لك اني لم احصل على خطأ بالترجمة..؟؟؟!! :o

انا اقول لك من البداية انه صار خطأ بالترجمة لمتحول الـbyte بسبب الـ overflow

وقد ذكرت رسالة الخطأ ايضاً . اقرأ المشاركة الاولى

وللعلم اني استخدم الاصدارين 1.5 و 1.6 من jdk

اقتباس
لأن صن على ما يبدو قد منعت إجراء العمليات علىByte مباشرة ومن ذلك عملية الضرب والقسمة وحتى التحريك إلى اليسار وإلى اليمين

وقصرتها على الأنواع الأخرى

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

هذا بالتأكيد غير صحيح

ابسط دليل: جرب مثلاً اسناد جداء عددين ناتجهما اقل من 127 الى متحول من نوع byte (لكيلا يحصل الـoverflow) ستجد ان "صن"! لم تمنع ذلك!!

او حتى استخدم "التحريك" الذي سميته ستجد انه لا مشكلة للمترجم طالما لم يحصل overflow او underflow

byte x = 127>>2;
byte x = 5*10;

شكراً لك

تم تعديل هذه المشاركة بواسطة bassamBST في 26 أغسطس 2007 في 14:13

#8

لا أعلم يا أخي لكني حصلت على مشكلة في أي عملية جربتها

والمشكلة لا تتحدث عن overflow وإنما تتحدث عن عدم تطابق طرفي المعادلة في نوع البيانات

وقد أشرت إلى ذلك مسبقاً

الله معك

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#9

because the result of any byte ,char , int operation is int

so when you say

byte bigger = big * 4;

the result is int ,how its fit in the byte either make casting explicitly or make bigger as int

read sun tutorial

#10

حياك اخي صاحب السؤال ...

اعترف اني تسرعت جداً في الرد .. لم انظرالى الاعداد .. لان تركيزي

كان فقط على رسالة الخطأ التي ظهرت معك .. و لذلك قلت لك بعجاله اني سأحاول

مساعدتك بدءاً من الكود الثاني

رسالة الخطأ التي ظهرت معك كانت كالتالي :

possible loss of precision: int, required: byte

هذه الرساله بحسب معلوماتي لا تشير الى اي overflow و انما تعني كما ذكرت

لك سابقاً انك تسند قيمة من نوع كبير الى قيمة من نوع صغير ...

انت تستطيع ادخال قيمة نوع byte الى متغير من نوع int .. غير ان العكس غير

صحيح .... و على هذا الاساس حاولت ان اساعدك في ردي الاول

طبعاً انا ندمت على الرد من الاساس .. لأني (و انا العائده الى المنتدى حديثاً) شعرت في

تعليقك نوع من الاستهزاء ... و كأننا هنا فقط لرد على الاسئله .. فإن لم تكن ردودنا كما

يجب، استحقينا التقريع ... !!

عموماً .. لا مشكله ..

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#11

شكراً لكم جميعاً على تفاعلكم

واعتذر عن سوء فهمي لكم او فهمكم لي..

تم تعديل هذه المشاركة بواسطة bassamBST في 27 أغسطس 2007 في 00:09

#12

-_-

#13

بالنسبه لل int

ده الطبيعي عشان لما بتعدي القيمه المحدده لل int بتبقي النتيجه بالسالب ( علي ما أفتكر )

و بالنسبه لل byte :

اقتباس
because the result of any byte ,char , int operation is int

so when you say

byte bigger = big * 4;

the result is int ,how its fit in the byte either make casting explicitly or make bigger as int

هذا الموضوع مغلق.

مواضيع مشابهة