الرئيسية
سجل الزوار
القائمة البريدية
راسلنا
خريطة الموقع
جديد الصور
جديد البطاقات
جديد الصوتيات
المتواجدون الآن
تغذيات RSS
2012-08-10 07:06
التحويل العلني- Explicit Conversion
في الدرس السابق تعرفنا على أول طريقة من طرق تحويل الأنواع، وهي طريقة التحويل الضمني، وذكرنا بأنه يستخدم لتحويل المتغير إلى نوع يحتاج لمساحة تخزينية أكبر مما هو عليه!
أما في النوع الثاني الذي سنتعرف عليه في هذا الدرس، فيستخدم للتحويل إلى نوع يحتاج لمساحة تخزينية أقل مما هو عليه! ولكن بشرط أن يكون حجم المتغير مناسب للمساحة الجديدة. ومثال الكتاب في الدرس السابق يوضح فكرة هذه الطريقة جيداً.
من الجدولين 1 و 2 في درس أنواع البيانات، نجد أن المساحة التخزينية المتاحة لمتغير من النوع int هي 2 بايت، ويشمل هذا جميع الأعداد الصحيحة 2147483648- وحتى 2147483647 ولمتغير من النوع long هي 4 بايت ويشمل هذا جميع الأعداد الصحيحة من 9223372036854775808 - وحتى 9223372036854775807.
وهذا يؤكد إمكانية تحويل أي متغير long إلى int ولكن بشرط أن تكون قيمة المتغير long ضمن نطاق المتغير int. ولكن التحويل هنا علني أي يحتاج لكتابة كود إضافي كما في المثال التالي:
int a;
long b;
b=20;
a=(int) b;
Console.WriteLine("a = {0}", a);
Console.WriteLine("b = {0}", b);
هذا المثال عكس المثال السابق، فقد حولنا من long إلى int، وذلك بنقل القيمة الموجودة في المتغير b من النوع long إلى المتغير a من النوع int، وهذا ممكن حيث أن القيمة 20 موجودة ضمن نطاق النوعين long و int، ويتم ذلك بكتابة نوع المتغير الذي نريد التحويل إليه بين قوسين كما هو موضح أعلاه.
هذا في حال أن القيمة موجودة ضمن نطاقي المتغيرين، ولكن ماذا لو كانت القيمة أكبر من نطاق المتغير الذي نود التحويل إليه؟
كأن نحول من النوع short (مساحته التخزينية 2 بايت ويشمل هذا أي عدد صحيح ضمن النطاق من 32768- إلى 32767) إلى النوع byte (مساحته التخزينية 1 بايت ويشمل هذا أي عدد صحيح ضمن النطاق من 0 إلى 255) وذلك بنقل القيمة 257 من متغير نوعه short إلى متغير نوعه byte ؟
طبّق معنا هذا المثال لنرى النتيجة:
byte val1;
short val2;
val2=257;
val1= (byte) val2;
Console.WriteLine("val1 = {0}", val1);
Console.WriteLine("varl = {0}", val2);
نلاحظ أن القيمة قد تغيرت بعد نقلها إلى المتغير val1، أي بعد تحويلها من النوع short إلى النوع byte، ومن البديهي أن يحصل مثل هذا الأمر، والذي يعتبر من خطأ المبرمج وليس خطأ الكومبيوتر!
فكما عرفنا أن الكومبيوتر يحتفظ بالبيانات في صورتها الرقمية، أي في صورة سلسة من 0 أو 1 والتي يتم تخزين كل منها في خانة عشرية bit.
والنوع byte يحجز مساحة قدرها 1 بايت أي 8 خانات عشرية (1 بايت = 8 خانات عشرية) لتخزين قيمة المتغير من النوع byte فيها، بينما النوع short فيحجز مساحة قدرها 2 بايت أي 16 خانة عشرية لتخزين قيمة المتغير من النوع short فيها.
المساحة التخزينية المحجوزة للمتغير val1
من النوع byte
المساحة التخزينية المحجوزة للمتغير val2
من النوع short
في المثال السابق، قمنا بتخزين القيمة 257 في المتغير val2 وهو من النوع short وتم تخزينه كما يلي في ذاكرة الكومبيوتر:
وعند نقل هذه القيمة إلى المتغير val1 وهو من النوع byte يتم تخزين البيانات بدءً من اليمين إلى اليسار وحتى 8 خانات فقط وهي المساحة التخزينية المتاحة لهذا النوع! كالتالي:
وهذه القيمة الثنائية مساوية للواحد، ولهذا فالنتيجة ظهرت مساوية للواحد بعد نقل القيمة للمتغير val1 في المثال السابق.
هذا الأمر قد يسبب مشاكل في البرنامج، إذا لم ينتبه المبرمج لذلك أثناء البرمجة!
وأفضل طريقة لتجنب حدوث مثل هذا الأمر من دون انتباه المبرمج، هي إضافة الأمر التالي لتنبيه المستخدم برسالة خطأ إذا انتقلت القيمة بصورة غير كاملة إلى متغير ذو مساحة تخزينية أقل من احتياجه. وهناك طريقتين لذلك؛ كتابة كود إضافي، أو بتفعيل هذه الخاصية ضمن بيئة الدوت نت.
الطريقة الأولى:
checked(expression);
أو العبارة التالية لعدم التنبيه:
unchecked(expression);
وهذا المثال السابق بعد استخدام أمر التحقق من أن المتغير الجديد مناسب للقيمة المنقولة إليه:
byte val1;
short val2;
val2=257;
val1=checked((byte) val2);
Console.WriteLine("val1 = {0}", val1);
Console.WriteLine("varl = {0}", val2);
طريقة الأخرى كما ذكرنا ضمن بيئة VS.NET تجعل المترجم ينبه المبرمج عن هذا الخطأ دون الحاجة لكتابة الأمر السابق، وذلك بالنقر على اسم المشروع في نافذة Window Explorer بالزر الأيمن، وأختيار Properities، لتظهر نافذة جديدة، اختر Configuration Properties من القائمة الموجودة على يسار هذه النافذة، ثم أختر build. ثم من القائمة الموجودة على يمين هذه النافذة غير في خصائص الخاصية Check for Arithmetic Overflow/Underflow واجعلها True
|
|
خدمات المحتوى
|
تقييم
|
|
|
Powered by Dimofinf cms Version 3.0.0
Copyright© Dimensions Of Information Inc.