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

السؤال الاسبوعي (1 )

مغلق
بدأه مصعب غيلان في 3 أغسطس 2005 · 21 رد · 1,449 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

وجدت نفسي موجودا هذه الايام قادر على الدخول للانترنت بصورة متكررة فقلت لنفسي ماذا لو قمت بوضع مجموعة من الاسئلة نستفيد منها جميعا وتزيد معرفتنا بكيفية عمل الجافا

اذا هدفنا هو التعرف على عمل الجافا بقدر اكبر وليس الخوارزميات

السؤال الاول في هذا البرنامج

class plusOp
{
	public static void main(String[] S)
	{
  int a = 84000;
  int b = 85000;
  int c = a / b * b;   // start with Division
  int d = a * b / b;   // start with Multiplication

  System.out.println("a = "+a);
  System.out.println("b = "+b);
  System.out.println("c = "+c);
  System.out.println("d = "+d);
	}
}

يتوقع ان يكون خرج البرنامج بهذا الشكل

a = 84000
b = 85000
c = 84000
d = 85000

وربما يتوقعه البعض هكذا

a = 84000
b = 85000
c = 0
d = 85000

لكن اذا نفذت البرنامج ربما تجد شيئا اخر

نتمنى من يستطيع حلها ان يقوم بشرحها

وهذا البرنامج لمن اراد تحميله

plusOp.txt

#2

اخوي مصعب انا على حسب ما حسبتها طلع لي هذاء

a = 84000

b = 85000

c = 84000

d = 85000

طيب الشرح كيف اشرحها لنها واضحه في وجه نضري مع العلم ما جربت البرنامج

وراح اجرب البرنامج وارد لك خبر

#3

اذا قمت بتنفيذه اخي فايز ستجد حل اخر غير مكتوب هنا

لكن كيف طلع هذا الحل بالتأكيد هناك سبب منطقي

السؤال : ما هو السبب لتظهر النتيجة بذلك الشكل

#4

اوكي اخوي سوف اجرب ورد عليك ان شاء االله مع الشرح

#5

الجواب أظن كما في هو آخر توقع للأخ مصعب مع تغيير في الرقم الأخير

حيث يفترض أن يكون العدد سالب

الطريقة هي

أن الكومبايلر عندما يقوم بترجمة نص معين يبدأ من اليسار ما عدا في العمليات الحسابية فإنه يتبع ترتيباً معيناً وهو:

الأقواس

الضرب والقسمة

الجمع والطرح

ويعتمد في حال وجود عمليتين أو أكثر من نفس المستوى الأولوية من جهة اليسار

أما بالنسبة لكون العدد الأخير سالب ذلك لأني أظن أنه مع أول عملية ضرب سيبح عندنا عدد أكبر من تحمل النوع الصحيح

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

اللهم انفعنا بما علمتنا وعلمنا ما ينفعنا

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

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

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

728x90.png

#6

السلام عليكم

الجواب عندي كان لما عملت run للبرنامج :

a = 84000

b = 85000

c = 0

d = -17058

1- بالنسبة لقيمة a و b الناتج صحيح

2- بالنسبة لقيمة c المعادلة بتحكي إنه

int c = a / b * b;

يعني لما بنبدى بعلمية division ::: 84000/85000 حيكون الناتج zero لأنه هاد الإشارة ما بتاخد باقي القسمة =0.98 يعني لما بطلع الناتج صفر ونضربه بأي رقم حيكون الناتج صفر

3- بالنسبة لقيمة d ما توصلت لحل

هاد إستنتاجي ويا رب حيكون بمحل إجابة صحيحة

#7
a = 84000
b = 85000
c = 0
d = 84000

أشهد أن لا إله إلا الله ***************** وأشهد أن محمد عبده ورسوله

#8

السلام عليكم و رحمة الله

كنت أجرب و أكتب ردي أثناء قيام الإخوة بالرد :) ، و إجابتي لن تختلف كثيراً و سأضعها كما هي:

السلام عليكم و رحمة الله

عند تنفيذ البرنامج ينتج التالي:

a= 84000

b= 85000

c= 0

d= -17058

تفسير هذه النواتج بالنسبة ل c وجود قيم ذات علامات عشرية أثناء العملية و بالطبع

تعريف المتغيرات لا يسمح بوجود علامات عشرية، حاولت حل المشكلة بتغيير نوع c ل

float أو double لكن لم تعمل (لا زالت القيمة صفر).

بالنسبة ل d فيحدث ما يسمى integer overflow بسبب وجود قيم أعلى من مدى

inetger أثناء العملية و حلها بتغيير نوع d ل long .

بتغيير الكود للتالي :

class plusOp
{
	public static void main(String[] S)
	{
  long a = 84000;
  long b = 85000;
  float c = a / b * b;   // start with Division
  long d = a * b / b;   // start with Multiplication

  System.out.println("a = "+a);
  System.out.println("b = "+B);
  System.out.println("c = "+c);
  System.out.println("d = "+d);
	}
}

كان الناتج :

a = 84000

b = 85000

c = 0

d = 84000

هل إقتربت من الحل ؟

تم تعديل هذه المشاركة بواسطة محمد سمير في 3 أغسطس 2005 في 22:07

سبحانك اللهم و بحمدك ، أشهد أن لا إله إلا أنت ، أستغفرك ربي و أتوب إليك

مدونتي

http://www.facebook.com/brmjt

#9

السلام عليكم...

كما هو واضح لاغبار في نواتج a و b

بالنسبة لـ c ....بما أن المتغير من النوع int فإنه في عملية القسمة سيطرح الكسور من الناتج أي ناتج القسمة هي صفر وأي عدد تضربه في صفر يساوي صفر!!

أما بالنسبة لـ d لان عملية الضرب ستنتج عدد أكبر من المجال المعطى للنوع int مما يجعل العدد يدور في مجاله أي يأخذ قيم سالبة أذا استدعى ذلك..... لذلك ظهرت النتيجة سالبة!!

حسنا .... لنفكر في طريقة عمل هذا البرنامج!! لا نريد المخرجات فقط!! إنما تتبع سير العمل ....

class Test{
  public static void main(String [] s){
     myMethod(3);
  }
  public static void myMethod(int n){
     if(n>0){
       System.out.println("ArabTeam2000");
       myMethod(n-1);
       System.out.println("Hi...");
       myMethod(n-1);
     }
  }
}
#10

السلام عليكم

بالنسبه لاجابة الاخوة للفقرة c فهي صحيحه اما الفقرة d فالناتج كما يلي:

class plusOp
{
	public static void main(String[] S)
	{
  int a = 84000;
  int b = 85000;
  int c = a / b * b;   // start with Division
  int d = a * (b / b);   // start with Multiplication

  System.out.println("a = "+a);
  System.out.println("b = "+b);
  System.out.println("c = "+c);
  System.out.println("d = "+d);
	}
}

هنا سيتم ضرب الرقم a*b اولا مما يعطي الناتج 7140000000 ويتم ادخاله في المتغيرd وهوى من النوع int والذي بدوره لاتحمل الا القيمة من 2147483647 الى القيمة السالبه -2147483648

ثم يقسمها على القيمة b والتي تساوي 85000 فتكون النتيجة 1449934592 - والذي يتم قسمته على 85000 فيكون الناتج 17058 -

وهذا المثال للتبسيط

class plusOp
{
	public static void main(String[] S)
	{
  int a = 84000;
  int b = 85000;
  int c = a / b * b;   // start with Division
  int d = a * b;   // start with Multiplication
  int e = d / b;

  System.out.println("a = "+a);
  System.out.println("b = "+b);
  System.out.println("c = "+c);
  System.out.println("d = "+d);
  System.out.println("e = "+e);
  
	}
}

زورو موقعنا

www.algabal.com

#11

جديدة،،، وضحكت علي!!...

#12

السلام الظاهر اني و صلة متاخررر

هنا سيتم ضرب الرقم a*b اولا مما يعطي الناتج 7140000000 ويتم ادخاله في المتغيرd وهوى من النوع int والذي بدوره لاتحمل الا القيمة من 2147483647 الى القيمة السالبه -2147483648

ثم يقسمها على القيمة b والتي تساوي 85000 فتكون النتيجة 1449934592 - والذي يتم قسمته على 85000 فيكون الناتج 17058 -

لكن الى الان ماوصلة لتحليل منطقي لـ d يعني يمكن يكون السبب مجال int بحيث مررت له قيمه

اكبررر من مجاله والله اعلم ..

سلام ;)

#13
alaadiaa كتب:
الجواب أظن كما في  هو آخر توقع  للأخ مصعب مع تغيير في الرقم الأخير

حيث يفترض أن يكون العدد سالب

طبعا ليس بالضرورة ان يكون سالبا

لانه لو كان العدد الناتج كبير سيكون الطفحان كبير وربما يذهب للموجب

eng_2007 كتب:
الجواب عندي كان لما عملت run للبرنامج :

a = 84000

b = 85000

c = 0

d = -17058

1- بالنسبة لقيمة a  و b  الناتج صحيح

2- بالنسبة لقيمة c  المعادلة بتحكي إنه

int c = a / b * b;

يعني لما بنبدى بعلمية division  ::: 84000/85000 حيكون الناتج      zero  لأنه هاد الإشارة ما بتاخد باقي القسمة =0.98  يعني لما بطلع الناتج صفر ونضربه بأي رقم حيكون الناتج صفر

ما قلته هنا صحيح في عملية القسمة الاعداد الصحية يتم تجاهل الكسر وتقريب النتيجة لاصغر عدد صحيح
eng_2007 كتب:
3- بالنسبة لقيمة d ما توصلت لحل

هاد إستنتاجي ويا رب حيكون بمحل إجابة صحيحة

ربما لم تأخذ في بالك ان العمليتين

int c = a / b * b; 
int d = a * b / b;

متشابهتين اذ ان الضرب والقسمة عملية تبديلية

لكن هنا في احدى العمليات يبدأ الضرب وفي الاخرى يبدأ القسمة

محمد سمير كتب:
عند تنفيذ البرنامج ينتج التالي:

a= 84000

b= 85000

c= 0

d= -17058

تفسير هذه النواتج بالنسبة ل c وجود قيم ذات علامات عشرية أثناء العملية و بالطبع

تعريف المتغيرات لا يسمح بوجود علامات عشرية، حاولت حل المشكلة بتغيير نوع c ل

float أو double لكن لم تعمل (لا زالت القيمة صفر).

بالتأكيد لن تعمل لان عملية القسمة هنا في الجافا تعتمد على المتغيرات التي تحدث عليها العملية وليس على مستقبل النتيجة

وهنا العملية تحدث لمتغيرين صحيحين من نوع long لذا فان الناتج عدد long يحول بعد ذلك الى float

مثلا لو غيرت الكود الى

int a = 84000;
 int b = 85000;
 double c = a / b * b;   // start with Division
 double d = a * b / b;   // start with Multiplication

لن يتغير شيء لان العملية تحدث على int لان كلا المتغيرين a,b من نوع int

محمد سمير كتب:
بالنسبة ل d فيحدث ما يسمى integer overflow بسبب وجود قيم أعلى من مدى

inetger أثناء العملية و حلها بتغيير نوع d ل long .

نعم لكن انت غيرت a,b كذلك ولم تغير d فقط

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

globaljava كتب:
السلام عليكم...

كما هو واضح لاغبار في نواتج a و b 

بالنسبة لـ c ....بما أن المتغير من النوع int فإنه في عملية القسمة سيطرح الكسور من الناتج أي ناتج القسمة هي صفر وأي عدد تضربه في صفر يساوي صفر!!

نعم وهذا الى الان قد تم الاتفاق عليه
globaljava كتب:
أما بالنسبة لـ d لان عملية الضرب ستنتج عدد أكبر من المجال المعطى للنوع int مما يجعل العدد يدور في مجاله أي يأخذ قيم سالبة أذا استدعى ذلك..... لذلك ظهرت النتيجة سالبة!!
ممكن توضح اكثر
globaljava كتب:
حسنا .... لنفكر في طريقة عمل هذا البرنامج!! لا نريد المخرجات فقط!! إنما تتبع سير العمل ....
ربما نرجع اليه بعد ان نحل مشكلتنا الاولى
akram كتب:
هنا سيتم ضرب الرقم a*b اولا مما يعطي الناتج 7140000000 ويتم ادخاله في المتغيرd وهوى من النوع int والذي بدوره لاتحمل الا القيمة من 2147483647 الى القيمة السالبه -2147483648

ثم يقسمها على القيمة b والتي تساوي 85000  فتكون النتيجة 1449934592 - والذي يتم قسمته على 85000 فيكون الناتج 17058

وهنا ايظا ساضع سؤال :

من اين جاءت هذه القيمة وكيف جاءت بالتفصيل وهل يمكنني معرفتها بطرق حسابية -1449934592

أبومازن كتب:
جديدة،،، وضحكت علي!!...
على فكرة اخ حسام كنت اقصد بال vm انك مثل virtual machine في تتبعك للاخطاء
#14
فايز السدله كتب:
لكن  الى الان ماوصلة  لتحليل منطقي  لـ d  يعني  يمكن يكون السبب مجال int بحيث مررت له قيمه

اكبررر من مجاله  والله اعلم ..

  سلام  ;)

والان يا شباب : تفسير العملية كما قلت سابقا يجب ان تتعلم هذا المبدأ في الجافا

في الجافا نتيجة العملية الحسابية تعتمد على المتغيرات التي تحدث عليها العملية وليس على المتغير الذي يستقبل النتيجة

بمعنى اخر انه اذا كان كلا من a,b من نوع int فان العملية التي تحدث تخزن على متغير من نوع int ومن ثم تعطى النتيجة الى المتغير c او d فحتى لو كان كلا من c,d ليس من نوع int فانه سيتم تحويل النتيجة الى نوع c,d

لكن لو كان a,b من نوع long فان العملية ستتم على اساس انها long

يتم التأكد من ذلك اذا عدلت الكود من int الى long بالنسبة لـ a,b فقط

class plusOp
{
public static void main(String[] S)
{
 long a = 84000;
 long b = 85000;

 int d = a * b / b;   // start with Multiplication

 System.out.println("a = "+a);
 System.out.println("b = "+b);
 System.out.println("d = "+d);
}
}

سيعطي هذا البرنامج خطأ لانك تحاول اسناد قيمة من نوع long الى int

لذا ستضطر الى تعديل الكود الى

class plusOp
{
public static void main(String[] S)
{
 long a = 84000;
 long b = 85000;

 long d = a * b / b;   // start with Multiplication

 System.out.println("a = "+a);
 System.out.println("b = "+b);
 System.out.println("d = "+d);
}
}

بعد ان غيرت المتغير d الى نوع long سيتنفذ البرنامج

كذلك يمكنك التأكد من ذلك دون تحويل d الى long وذلك بطباعة ناتج العملية الحسابية مباشرة

class plusOp
{
public static void main(String[] S)
{
 long a = 84000;
 long b = 85000;

 System.out.println("a = "+a);
 System.out.println("b = "+b);
 System.out.println("d = "+a * b / b);
}
}

ستظهر نتيجة d 84000

كذلك لو عدلته مرة اخرى واعدت a,b الى النوع int

class plusOp
{
public static void main(String[] S)
{
 int a = 84000;
 int b = 85000;

 System.out.println("a = "+a);
 System.out.println("b = "+b);
 System.out.println("d = "+a * b / b);
}
}

ستظهر نتيجة d -17058

لان العملية هنا int

#15

طيب شباب جرب هذا الكود واخبروني بالنتيجة

Program 1

class plusOp
{
public static void main(String[] S)
{
 int a = 84000;
 int b = 85000;

 int d = 84000 * 85000 / 85000;   // start with Multiplication

 System.out.println("a = "+a);
 System.out.println("b = "+b);
 System.out.println("d = "+d);
}
}

ثم عدله لهذا الكود وجرب

Program 2

class plusOp
{
public static void main(String[] S)
{
 int a = 84000;
 int b = 85000;
 long b2 =b;

 int d = a * b / b2;   // start with Multiplication

 System.out.println("a = "+a);
 System.out.println("b = "+b);
 System.out.println("d = "+d);
}
}

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

ثم عدله لهذا الكود وجرب مرة اخرى

Program 3

class plusOp
{
public static void main(String[] S)
{
 short a = 84;
 short b = 85;
 short c = a / b * b;   // start with Division
 short d = a * b / b;   // start with Multiplication

 System.out.println("a = "+a);
 System.out.println("b = "+b);
 System.out.println("c = "+c);
 System.out.println("d = "+d);
}
}

يجب ان تعلم ان الخطأ الذي سيظهر مفاده انه لا يمكن تحويل int الى short على الرغم من عدم ذكر كلمة int هنا

هذا ايظا سيصيبك بالتشويش ولن تسطيع التفكير بعدها الا اذا نسفت المبدأ الاول الذي توصلنا اليه

طبعا المبدأ الاول صحيح مئة بالمئة ولا غبار عليه

#16
نتيجة  program 1

a = 84000
b = 85000
c= -17058

نتيجة program 2

نتيجة البرنامج ... تظهر خطاً..... لاننا وبكل بساطة أسندنا النوع long إلى int وفي هذه الحالة فقط نحتاج إلى عملية (down casting) ألى النوع int وهذا البرنامج بعد التصحيح...

class plusOp
{
public static void main(String[] S)
{
int a = 84000;
int b = 85000;
long b2 =b;

int d = a * b /(int) b2;   // start with Multiplication

System.out.println("a = "+a);
System.out.println("b = "+b);
System.out.println("d = "+d);
}
}

نتيجة program 3

نلاحظ أن عملية الضرب والقسمة خاصة لـ int و float و double و long ....

بمعنى أخر عملية الضرب والقسمة لا يمكن أن تجرى على short و byte لان عدد البتات قليل!!!!

أو بطريقة أخرى تحتاج إلى عملية casting لاصلاح الوضع ... وإلا رسالة الخطأ ستظهر..

#17

لكن هذا الكود لم يحل المشكلة

int d = a * b /(int) b2;   // start with Multiplication

ايظا اذا عدلت الكود الى هذا لا يحصل تغيير رغم ان احد المتغييرات الداخلة في العملية الحسابية long

لاحظ هنا نوع d وايظا المتغير b2 من نوع long

class plusOp
{
public static void main(String[] S)
{
int a = 84000;
int b = 85000;
long b2 =b;

long d = a * b / b2;   // start with Multiplication

System.out.println("a = "+a);
System.out.println("b = "+b);
System.out.println("d = "+d);
}
}

بالنسبة للبرنامج الاول طبعا فان اي رقم صحيح يتم كتابته في اي معادلة حسابية يعتبر من نوع int

لذا يتعامل مع الارقام على اساس انها int ولا يحولها الى long

#18

ماذا تقصد بعبارة....أن الكود لم يحل المشكلة!!

هل جربت البرنامج!!!

البرنامج يعمل بشكل جيد..... ويعطي النتائج السابقة أيضا!!!

اقتباس
بالنسبة للبرنامج الاول طبعا فان اي رقم صحيح يتم كتابته في اي معادلة حسابية يعتبر من نوع int

لذا يتعامل مع الارقام على اساس انها int ولا يحولها الى long

وهذا مثال :

هذا السطر يظهر رسالة خطأ عند الترجمة

long i =21474836409;

علما أن القيمة 21474836409 قابلة للتمثيل على النمط long

لكن لانها تخزن على نوع int فان رسالة الخطأ تظهر لكون الرقم غير قابل للتمثيل على النمط int

لذا نحتاج لتصحيح الخطأ كتابة L في نهاية العدد على الشكل التالي

long i =21474836409L;

**********

لناخذ هذا المثال

byte b = (byte) 300;

نجد ان القيمة العظمى للنمط (byte ) هي +127وهذا يعني اننا سنفقد القيمة الفعلية للعدد واذا حاولت إظهار قيمة المتغيرb ستحصل على ناتج مختلف هو العدد(44) لان ما يحدث في الحقيقة هو اقتطاع البتات مابعد البت الثامن ( لان byte تمثل بـ 8 bit) في التمثيل الثنائي للعدد 300.

وباختصار عند التحويل من نمط كبير مثلا(int) إلى نمط صغير مثلا (byte) فإنه سيفقد القيمة الفعلية للعدد واذا حاولت إظهار قيمة المتغير ستحصل على ناتج مختلف لان ما يحدث في الحقيقة هو اقتطاع البتات مابعد البت (الخاص بكل متغير)

******************************

في المرفق ستجد برنامج يقوم بالتحويل من عدد صحيح (int) إلى بت (bit)

لاحظ اذا ادخلت عددا أكبر من القيمة العظمى للمتغير ماذا يحدث ..... مثال : 21474836409

بالتوفيق

PrintBits.zip

#19
اقتباس
هل جربت البرنامج!!!

البرنامج يعمل بشكل جيد..... ويعطي النتائج السابقة أيضا!!!

نعم حل المشكلة الاولى ولكن لم يحل المشكلة الثانية حيث ان النتيجة لا تزال تظهر بالسالب على الرغم من انا قمنا بادخال عدد من نوع long في العملية ومع ذلك عندما ضرب a في b حصلت عملية overload على الرغم من ان العملية ايظا دخل فيها المتغير b2 الذي هو من نوع LONG

ونحن قلنا في كلام سابق ان العملية في الجافا تعتمد على انواع المتغيرات

فاذا غيرت الكود الى هذا

long d = a * b2 / b;

فان الناتج ستيغير الى

d=84000

بينما

long d = a * b / b2;

d=-17058

واذا نظرت في الكودين وجدت ان المتغير b2 من نوع long وهو داخل في العمليتين

اقتباس
علما أن القيمة 21474836409 قابلة للتمثيل على النمط long

لكن لانها تخزن على نوع int فان رسالة الخطأ تظهر لكون الرقم غير قابل للتمثيل على النمط int

مع ذلك هذا السطر

byte i =21;

لا يظهر اي خطأ على الرغم من اعتبار انه تم اسناد قيمة int (كما قلت عن الاعداد) الى متغير من نوع byte

بمعنى اخر اذا اعتمدنا على ما قيل سابقا بان الاعداد المذكورة كارقام في البرنامج تكون من نوع int دائما

فان اي اسناد لقيمة مكتوبة كرقم الى اي متغير يجب ان يحدث معها cast لتحويلها لنوع المتغير الذي يستقبلها اذا كان هذا المتغير من نوع خزن صغير

أمثلة

class Test
{
	byte a=2;
	byte b =2*a;
}

العملية هنا تحدث بين رقم يعتبر اصلا من نوع int مع متغير a من نوع byte لذا تتحول النتيجة الى نوع int لذا يظهر خطأ مفاده انه لا يمكن اسناد قيمة int الى نوع byte

بينما هنا

class Test
{
	byte a=2;
	byte b =2*2;
}

لا يظهر اي خطا رغم ان القيم 2 و 2 تعتبران من نوع int على حسب ما قلناه سابقا وهنا ايظا تحدث عملية ضرب على القيمتين فيفترض ان يكون الناتج نوع int وسيظهر رسالة خطأ لان النتيجة 4 تعتبر الان انها من نوع int وعلى الرغم من ذلك لا تحدث رسالة الخطأ.

#20

بالنسبة لـ

long d = a * b2 / b;

لان الضرب سيتم مع long و int في هذه الحالة ستتم عملية (Widening) أي أن نتيجة

a*b2 ستكون ضمن مجال long بعدها نجري القسمة أيضا ستتم عملية (Widening) ... ويصبح الناتج 84000...أي هنا يتم حسب الاولوية .... من اليسار إلى اليمين

بالنسبة لـ

long d = a * b / b2;

لان الضرب سيتم مع intو int أي من نفس النوع في هذه الحالة ستكون نتيجة a*b من نوع int وتكون سالبة لانها تجاوزت القيمة العظمى ثم تتم عملية (Widening) بعدها نجري القسمة... ويصبح الناتج سالب -17058

......حل مشكلة الاشارة السالبة

long d = (long)a * b / b2;

byte i =21;

نعم هذا السطر لن يظهر رسالة خطأ لانه ضمن مجال الـ byte (من -128 إلى +127) هذا العدد مازال ضمن مجال int

اقتباس
بمعنى اخر اذا اعتمدنا على ما قيل سابقا بان الاعداد المذكورة كارقام في البرنامج تكون من نوع int دائما

فان اي اسناد لقيمة مكتوبة كرقم الى اي متغير يجب ان يحدث معها cast لتحويلها لنوع المتغير الذي يستقبلها اذا كان هذا المتغير من نوع خزن صغير

للتوضيح :

يتم التعامل مع byte,short,long,char,int كأعداد صحيحة.... هذا ماأقصده أي كما ذكرت

أنها أصلا من نوع int

class Test
{
byte a=2;
byte b =2*a;
}

هنا تتم عملية (Widening) إلى النوع int ثم يتم الاسناد إلى byte وهذا مستحيل من دون down casting

أعتقد أن الامور واضحة ..... up casting و down casting....

#21

الان وصلنا الى الحل بشكل صحيح

شكرا globaljava يبدو انك محترف جافا

لكن بعد هذا النقاش الحاد نحتاج لتلخيص ما قيل سابقا

ام ان كل شيء واضح؟

#22

لووووووووووووووووووول شباب انا صفر في الجافا يعني لي شهرر واحد بس من يوم عرفت الجافا

اتمنى ان ان نكسب الخبره منكم يا شبااب

تحياتي لكم

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

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