مشكلة في الجافا و C#

اعمل كمطور مواقع بتقنية ASP.net واخيرا انتقلت من فيجوال بيسك دوت نت الى C#.

سؤالي هو لماذا لايمكن اجراء العمليات الحسابية على الانواع Byte - short سواء في الجافا او C#، نعم اعرف حل المشكلة لكني لا اعرف السبب العلمي لذلك.

على سبيل المثال تم تعريف 3 متغيرات من نوع short ولكن عند محاولة جمع قيمة المتغير x مع المتغير y واسناد الناتج الى المتغير z يظهر الخطا التالي:

;short x = 1, y = 1

short z = x + y; // Compile-time error

واذا كان لايتم استخدام المتغيرات من النوع Byte و Short فما هي استخداماتهم !!

وشكرا لكم

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

عبد الرحمن أحمد أضف ردا

عندما يكون هناك احتمالية ضياع بيانات أو طفحان أثناء التحويل بين القيم يمنع المترجم التحويل التلقائي لكي يجعل المبرمج يعالج المسألة عن دراية.

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

مثلا جمع متحولين من نوع بايت سيجعل الناتج ما بين 0 و 510 وبالتالي القيم ما بين 256 و 510 لن يقبلها النوع byte و لا بد من نوع ذو سعة أكبر

sniper_man2018 أضف ردا

شكرا لك استاذ عبد الرحمن

في الكود التالي تم جمع قيميتن من نوع واحد int واسناد حاصل الجمع الى متغير من نوع int ايضا ومع ذلك لم يحدث اي خطا برمجي:

;int numberOne, numberTwo,sum

;numberOne = 10

;numberTwo = 20

// correct

;sum = numberOne + numberTwo

;(Console.WriteLine(sum

في حالة النوع int لأنه نوع يحجز البت الأخير للإشارة وبالتالي فإن قيمته تتراوح من-2,147,483,648 إلى 2,147,483,647 وبالتالي حتى لو جمعت أعظم قيمتين لمتغيرين من نوع int فإن الناتج يمكن أن يستوعبه النوع int نفسه لأنه يحوله إلى الجهة السالبة

بينما في النوع بايت و شورت قيمهم تتراوح ما بين 0 وأعظم عدد تستوعبه الخانات وبالتالي أي زيادة يعتبر طفحان لهذا فإنه يفترض أن ناتج جمع متحولين من النوع byte أو short أو حتى int هو int ولهذا إما أن تجعل نوع متغير النتيجة int أو تعرفه ب var أو تقوم بتحويل قسري مع توقع ضياع بيانات.

حسب التوثيق عندما تقوم بعمليا ضرب طرح وجمع على short ، byte يتم تحويلهم بشكل تلقائي الى int وبتالي الناتج من العملية هو int وليس short لذلك يجب عليك تحويل الناتج الي int عن طريق casting

شكرا لك صديقي اجابة موفقة، نعم هذا ماكنت ارغب في الحصول عليه.

معلومة اضافية عندما تحدثت مع مبرمجين اجانب وقلت لهم ما الهدف من وجود byte و short اذا كان لا يمكننا القيام بالعمليات الحسابية التي تعتبر اساس علم البرمجة، ذكروا لي انه يتم استخدام الـ byte من اجب معالجة الصور والتعامل مع I/O

شكرا لك صديقي على اجاباتك

brg أضف ردا

short z = x + y; // Error: no conversion from int to short

To fix this problem, use a cast:

short z = (short)(x + y); // OK: explicit conversion

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