إعلان
تعلم الآن

التحويل بين أنواع البيانات البدائية (Type Casting) في جافا

في هذا المقال سنتعرف على أنواع البيانات البدائية, طريقة تحويل أنواع البيانات ( Type Casting ), و ستتعرف على المشاكل التي قد تحدث عن تحويل أنواع البيانات ( Type Casting Problems ).

 

أنواع البيانات البدائية

أكثر أنواع البيانات التي نتعامل معها هي التالية:

  1. النوع byte و يتألف من 8bit، و يخزن الأعداد الصحيحة فقط.
  2. النوع short و يتألف من 16bit، و يخزن الأعداد الصحيحة فقط.
  3. النوع int و يتألف من 32bit، و يخزن الأعداد الصحيحة فقط.
  4. النوع long و يتألف من 64bit، و يخزن الأعداد الصحيحة فقط.
  5. النوع float و يتألف من 32bit، و يخزن الأعداد العشرية فقط.
  6. النوع double و يتألف من 64bit، و يخزن الأعداد العشرية فقط.

لكل نوع من هذه الأنواع قيم محددة يمكنك تخزينها فيه فمثلاً لا يمكنك تخزين القيمة 1000 في متغير نوعه byte لأن له قيم محددة يمكنه أن يستوعبها و هذا يعد أكبر منه، لن نتطرق إلى هذه التفاصيل لأنه ليس محور درسنا.

الآن لنعد لموضوعنا, تحويل أنواع البيانات يمكن تقسيمه لفئتين هما:


 

Implicit Type Casting

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

بالمنطق إذا كنت تضع عشرين طالب في صف صغير, فيمكن حتماً وضع نفس العشرين طالب في صف أكبر.

برمجياً, إذا قمت بتعريف متغير نوعه byte و من ثم قمت بتخزينه في متغير نوعه int أو long أو حتى double فإن مترجم لغة جافا سيقوم بتحويله لك بشكل تلقائي و بدون أي مشاكل، لأنك بكل بساطة تقوم بتخزين قيمة متغير في قيمة متغير آخر عدد الـ Bit فيه أكبر.

 

مثال

في المثال التالي قمنا بتعريف متغير إسمه a, نوعه byte و قيمته 10.

بعدها قمنا بتخزين قيمة المتغير a في متغير آخر إسمه b و نوعه int.

بعدها قمنا بتخزين القيمة الموجودة b و التي نوعها int في متغير آخر إسمه c و نوعه double.

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

public class TypeCasting {
    public static void main(String[] args) {
        
        byte a=15;  
        
        int b=a; 
        
        double c=b;
        
        System.out.println("a = "+a);
        System.out.println("b = "+b);
        System.out.println("c = "+c);
    
    }
    
}

ستحصل على النتيجة التالية عند التشغيل.

a = 15
b = 15
c = 15.0



الآن كما ترى فإن البرنامج تم تشغيله بنجاح وبدون أي مشاكل. و أيضاً لاحظت أنه عندما قمنا بتخزين المتغير b الذي نوعه int في المتغير c الذي نوعه double فإنه اكتسب خاصية الفاصلة الموجودة في النوع double.

لذلك نستطيع القول انه عند التحويل من نوع لنوع آخر فإن المتغير قد يكتسب أو يفقد خاصية و ذلك يعتمد على حسب النوع الذي يتم التحويل إليه.

 

Explicit Type Casting

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

بدايةً، هذا النوع بكل بساطة هو عكس النوع السابق، ففي النوع السابق كنا نقوم بتخزين نوع عدد الـ Bit فيه أكبر من عدد الـ Bit الذي كنا نضعه فيه.

أما هنا فإننا نقوم بتخزين نوع عدد الـ Bit فيه أكبر من عدد الـ Bit الذي سنضعه فيه.

فهل يا ترى سيسمح لنا الكمبيوتر بذلك؟! لنجرب و نكتشف.

 

المثال الأول

في المثال التالي قمنا بتعريف متغير إسمه a, نوعه int و قيمته 10.

بعدها, قمنا بتخزين قمية المتغير a في متغير إسمه b و نوعه byte.

في الأخير قمنا بطباعة قيمة المتغير b.

public class TypeCasting {
    public static void main(String[] args) {
        
        int a=10;
        
        byte b=a;
        
        System.out.println("b = "+b);
    
    }
    
}

الآن بعد كتابتك لهذا الكود و قبل أن تقوم بتشغيل الكود ستلاحظ أن المحرر أظهر أن لديك خطأ في الكود الذي كتبته و هو عندما حاولت تخزين المتغير الذي نوعه int في المتغير الذي نوعه byte، وعندما تقوم بتشغيل البرنامج سيظهر لك الخطأ التالي.

Exception in thread "main" java.lang.RuntimeException:
Uncompilable source code - incompatible types:
possible lossy conversion from int to byte


لماذا ظهرت لنا هذه الأخطاء و كيف نقوم بعملية التحويل هذه بدون أي أخطاء؟

الآن في هذه النقطة بالتحديد كأن الكمبيوتر يخبرك عندما أظهر لك هذا الخطأ أنه لا يمكنه إتمام عملية التحويل هذه لأنه لا يضمن لك أن تكون مخرجات هذا الكود سليمة، لأنك تحاول تخزين قيمة متغير يحتوي على عدد Bit أكبر من التي يمكن وضعها في الآخر، و سنرى في أمثلة أخرى كيف أن هذا سيسبب لنا أخطاء منطقية جمة.

 

كيف نقوم بإتمام عملية التحويل هذه؟

كل ما علينا فعله أن نقوم بعملية الـ Type Casting، و في هذه الحالة كأننا نجبر الكمبيوتر بالقيام بهذه العملية ونقول له: قم بهذه العملية و نحن من يتحمل نتائجها.

 

المثال الثاني

سنقوم بتنفيذ عملية الـ Type Casting على الكود السابق.

public class TypeCasting {
    public static void main(String[] args) {
        
        int a=10;
        
        byte b=(byte)a;
        
        System.out.println("b = "+b);
    
    }
    
}

ستحصل على النتيجة التالية عند التشغيل.

b = 10

العبارة (byte) التي وضعناها هنا هي التي قامت بعمل الـ Type casting، حيث كأننا قلنا للكمبيوتر قم بتحويل المتغير a الذي نوعه int إلى byte، ثم قم يتخزينه في المتغير b الذي نوعه byte، و بالفعل قام الكمبيوتر بإتمام هذه العملية دون أي مشاكل.

 

المثال الثالث

في المثال التالي قمنا بتعريف متغير إسمه a, نوعه int و قيمته 900.

بعدها قمنا بتخزين قيمة المتغير a في متغير إسمه b و نوعه byte.

في الأخير قمنا بطباعة قيمة المتغير b لنرى ما اذا تمت عملية التحويل بشكل صحيح أم لا.

public class TypeCasting {
    public static void main(String[] args) {
        
        int a=900;
        
        byte b=(byte)a;
        
        System.out.println("b = "+b);
    
    }
    
}

ستحصل على النتيجة التالية عند التشغيل.

b = -124

ربما الآن تتعجب لماذا ظهر لك العدد -124.

ما حدث في الكود السابق هو أننا حاولنا تخزين قيمة متغير عدد الـ bit فيه بالأساس أكبر من عدد الـ bit التي يمكن أن يستوعبها.

برمجياً المتغير الذي نوعه byte يتألف من 8bit, و بالتالي يمكنه كحد أقصى أن يخزن القيمة 127.

المتغير الذي نوعه int يتألف من 32bit, و بالتالي يمكنه كحد أقصى أن يخزن القيمة 2,147,483,646.

إذاً, العدد 900 لا يوجد أي مشكلة إن تم وضعه في متغير نوعه int و لكن مستحيل أن يتسع في متغير نوعه byte.

لذلك في هذا المثال أخبرنا الكمبيوتر بالقيام بعملية التحويل و أننا نحن من يتحمل النتائج، فبكل بساطة عندما وجد الكمبيوتر أن العدد 900 يحتاج أكثر من 8bit حتى يتمكن من تخزينه, فكأنه قام بقص عدد الـ bit الزائدة و جعل عدد البتات يتناسب مع قدرة المتغير b الذي نوعه byte، فأعطانا رقم جديد لأن عدد الـ bit إختلف.

إذا كنت تتساءل: لماذا أعطانا عدد سلبي و ليس عدد إيجابي مثل 127 فلا تشغل بالك لأن طريقة حساب الكمبيوتر للأعداد غير طريقتنا نحن كبشر. تذكر الكمبيوتر لا تتخزن فيه الأرقام كما نراها بل تتخزن فيه كمجموعة من 0 و 1 فقط.

لهذا السبب ذكرنا سابقاً أن هذا النوع من الـ Type Casting يعد سلاح ذو حدين.

لذلك يجب عليك الإنتباه لأقصى عدد بتات يمكن للنوع تخزينها، و معرفة عدد Bit العدد الذي تريد تخزينه، حتى تحصل على النتيجة الصحيحة، و تضمن عدم حصول أية أخطاء في برنامجك.


يتضمن: Programming , Java

آخر تحديث: 19-12-2021

الكاتب

راشد الجميمي

طالب علوم حاسب مبتدئ (computer science). مهتم بجميع ما يتعلق بالتقنية. أسعى لمشاركة كل جديد تعلمته.

تعليقات 1

أضف تعليق

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

تقييم المقال

لم تقم بتقييم المقال بعد!

الدورات

أدوات مساعدة

أقسام الموقع

دورات
مقالات كتب مشاريع أسئلة