التحويل بين أنواع البيانات الرقمية في جافا

5  تعليق

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

هذا ليس خياراً، ولكن من التعلم يكونُ بالتجربة. أما البرمجة خاصّةً فمفتاح تعلّمها إنتاجُ الأخطاء، عمداً أو سهواً، فالمبتدئ بتعلم لغة البرمجة يكونُ مؤهلاً لإنتاجِ أكبر قدرٍ من الأخطاء يكفيه ليتعلم أنواعها.

حين بدأتُ تعلُّم البرمجة كمثل كل طالب علوم حاسب بدأت رحلتي مع إنتاج الأخطاء و محاولها إصلاحها، أحياناً فوراً و أحياناً أخرى أخضع إلى حالة (أرى الخطأ ولا أراه).

مثال لأخطاء المبتدئين في تعلم البرمجة

هذه الحالة التي تعني أنك تعرف أين حدث الخطأ وفي أي سطر ولكن قدرَ ما تُعيد قراءة الشفرة المصدرية تراها صائبة تماماً.

بعد عدة تجارب تعلّمتُ أنواع الأخطاء التي أوصلتني إلى هذه الحالة، و أصبحتُ أعرفها بنظرة عينٍ فقط دون أن أضيّع فيها وقتاً.

من إحدى هذه الأخطاء التي كُنت أعاني منها هي التحويل بين أنواع البيانات، و اليوم حتى لا تُعيد اختراع العجلة سأشرح لك طريقة التحويل بين أنواع البيانات.

لماذا نحتاج إلى تحويل أنواع البيانات

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

و أسهل طريقة للتخلص من مشكلة هي أن لا تقابلها أصلاً. حلٌ منطقي و جميل، ولكن لن يعمل في حالة التحويل بين أنواع البيانات.

حتى تعرف لماذا لا نستطيع تفادي هذه المشكلة سأخبرك لماذا تحتاجُ إلى أن تجري التحويل بين أنواع البيانات.

عندما يتعلق الأمر بنظم المعلومات فإن وظيفة هذه البرامج هي مساندة و دعم الأعمال و تحسين أدائها و نتائجها.

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

اسباب تحويل نوع البيانات في الجافا

إجراءُ العمليات الحسابية يعني أن البيانات التي جمعها البرنامج كمدخلات (مثل النثريات التي تم صرفها اليوم) سيتم إجراء عمليات حسابية عليها (مثل حساب مجموعها و عددها) ثم عرضها على الإدارة.

عند إدخال البيانات يتأكد البرنامج من أن المدخلات متوافقة مع نوع البيانات المطلوب (أرقام) ثم يتم حساب مجموعها و عددها (أرقام) ولكن عند عرضها فربما ترى الإدارة أنها ترغب بقرائتها بصورة أخرى (كنص) بدلاً عن صورتها الأصلية (أرقام).

هذه الحالة تكاد لا يستطيع تحاشيها مبرمج أو برنامج يخدم مجالات الأعمال، وربما هذا الإستخدام المتكرر للتحويل بين أنواع البيانات هو ما جعل أخطاءها في بداية تعلم البرمجة.

طرق تحويل أنواع البيانات

ذكرتُ فيما نشرتُ سابقاً أنواع البيانات الأولية مع ذكر أحجامها، هذه التدوينة التي تقرأها الآن مبنية على فرضية أنك تعلم ما هي أنواع البيانات و ما هي أحجامها، إذا لم تكن متأكداً منها راجع التدوينة بالرابط السابق ثم عد إلى هذه التدوينة.

هناك طريقتان للتحويل بين أنواع البيانات، و الإختلاف بينهما يعتمد على حجم نوع البيانات الذي سيُحوّل إليه.

  1. التوسعة Widening.
  2. التضييق Narrowing.

لنتعرف على كل نوع على حده.

التوسعة Widening: تحويل نوع البيانات إلى نوع أكبر

نسمي تحويل نوع  البيانات بالتوسعة Widening إذا كُنت تحول من نوع بيانات أصغر حجماً إلى نوع بيانات أكبر حجماً.

التوسعة مثل ماذا؟

  • التحويل من byte إلى short = توسعة.
  • التحويل من short إلى int = توسعة.
  • التحويل من int إلى long = توسعة.
  • التحويل من long إلى double = توسعة.

هذا النوع من تحويل نوع البيانات سهلٌ جداً و مُباشر ولا يتطلب منك كثير تفكير، لأن نوع البيانات الصغير عندما يُوضع في نوع أكبر حجماً بالتأكيد يستطيع استقباله كاملاً.

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

        byte tiny = 1;
        int small  =  tiny;
        double big = small;

التضييق:Narrowing: تحويل نوع البيانات إلى نوع أصغر

نسمى تحويل نوع البيانات بالتضييق Narrowing عندما يكون التحويل من نوع بيانات أكبر إلى نوع بيانات أصغر.

وعلى عكس نوع التوسعة، يجب أن تهتم جيداً بالتضييق قبل إجراءه، ليس جيداً… بل جيداً جداً … لسببين.

السببان هما:

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

طريقة إخبار المترجم بتحويل نوع البيانات إلى نوع أصغر هي بوضع نوع البيانات الذي سيتم التحويل إليه بين قوسين قبل القيمة المُسندة، غير واضح؟ أنظر المثال

        double big = 123456;
        int smaller = (int) big;

السببُ الثاني خفيٌ و هو أن إغفال التأكد من القيمة الموجودة بالمتغير قد يُحدث خطأً منطقياً من الصعب جداً الوصول إليه، لا سيما إذا ما كنت البرامج كبيرة !.

حلّل هذه الشفرة المصدرية

        double big = 123456789123456.00;
        int smaller = (int) big;
        
        System.out.println(smaller);

ما هي النتيجة التي تتوقع طباعتها؟ مع العلم أن الرقم المُسند إلى المتغير big لا يستطيع نوع البيانات int تحمله !.

فكّر قليلاً…

هذه هي النتيجة

تصغير تحويل نوع البيانات Data type conversion Narrwoing

إذا عرفت لماذا طُبعت هذه القيمة اشرح لنا ذلك في التعليقات.

الخلاصة
يُسمى التحويل من نوع بيانات صغير إلى كبير بـالتوسعة Widening و من نوع بيانات كبير إلى صغير بالتضييق Narrowing.

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


قد يعجبك أيضا

ما رأيك؟ اترك تعليقاً أدناه


  1. شكرا لك أستاذ مصطفى استفدت فعلا .. بالنسبة للسؤال في اخر المقالة فالجواب هو ان المتغير int لا يتحمل اكثر من 4 byte و يكون مدى تحمله هو 2147483647 فقط . اما الرقم الموجود في ال double فهو فوق قدرة ال int على تحمله .

  2. الواقع أن نظام العد في الآلة نظام ثنائي وقد حفظته الآلة كذلك ولها عدد من البايتات معلوم فعندما أردنا أن نعدله بالأمر قامت الآلة بحذف عدد من الخلايا (البايتات) للتتناسب مع نوع البيانات الذي أردنا تحويله اليه ومن ثم تحويله من النظام الثنائي الى النظام العشري فكانت هذه النتيجة
    فهل اقتربت من السبب؟؟؟

{"email":"البريد الالكتروني غير صحيح","url":"رابط الموقع غير صحيح","required":"بعض الحقول المطلوبة لم تتم تعبئتها"}

نجاح!

تنبيه!

خطأ!