16 - سلسلة تبسيط البرمجة – أنواع المعطيات القياسية

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

بسم الله الرحمن الرحيم

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

هو لتوجيه المترجم كيف سيتعامل معه

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

لأن الرقم يتم حجز له أربع بايتات ذاكرية وبالتالي نستطيع أن نحفظ فيه قيم من 0 وحتى 2 مرفوعة إلى اس 32 أي 4294967296

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

أي من -2147483648 و حتى +2147483647

لاحظو الأن أنه يجب ضمان أن المتغيرات المحجوزة بهذا النوع يجب أن لا تتخطى هذه الحدود حتى لا يحدث خطأ يسمى الطفحان Overflow وفي حال احتجنا لتمثيل أرقام أعلى فيجب تعريف المتحول من نوع آخر مثلا الرقم الطويل long والذي يحجز 8 بايتات أي 64 بت وبالتالي سيكون مجاله من

-9223372036854775808

إلى

+9223372036854775807

الفرق بين الاثنين أنه إذا لم نكن بحاجة لأرقام كبيرة فلماذا نحجز مساحة أكبر من الذاكرة ونحن لسنا بحاجة إليها

ولا سيما عندما يتم حجز عدد كبير من المتحولات وخاصة المتغيرات المصفوفية

فلو احتجنا لمتغير مصفوفي من النوع الرقمي الطويل وبحجم 100000 حجرة

حينها سنحتاج إلى ذاكرة بحجم 800000 بايت لهذا المتغير فقط

وبالتالي لو كان برنامجنا ضخما واحتجنا متغيرات كثيرة فسنستفذ الذاكرة ويتجمد الحاسب

إذا لو كنت أعلم أن أرقامي هي في حدود العدد ذو الـ 4 بايت إذا أوفر الذاكرة للنصف

من هنا قلنا تحديد أنواع المعطيات يوفر الموارد

وخذوا مثالا آخر لو كان لدينا قيمة تعبر عن نسبة مئوية وبالتالي القيمة ستكون محصورة بين 0 و 100 فقط إذا لماذا نحجز لها ذاكرة بحجم 4 بايت علما أنا بايت واحد يكفيها ولهذا تم تعريف نوع معطيات اسمه بايت byte والذي يستطيع حفظ قيم من 0 وحتى 255

وفي حال احتجنا لقيم سالبة يوجد نوع اسمه sbyte و الحرف s هو اختصار كلمة signed أي ذو إشارة وبالتالي سيكون مجال القيم من -127 إلى 127

بعض الأنواع تحجز حجم ديناميكي من الذاكرة يتغير تبعا للقيمة

فالنوع الذي يمثل النصوص أو السلاسل الرمزية متغير فإن كان يحوي فراغ أو لا شي فهو يحجز 4 بايت فقط لاسم المتغير

وفي حال بدأت تتغير القيم فبحسب الحروف يزداد حجم الذاكرة حيث كل رمز character يحتاج لبايت واحد فقط وهو كود الأسكي Ascii والذي هو جدول الرموز القياسية وعددها 255 رمز ولهذا يكفيها بايت أما في حال الرموز Unicode من أجل اللغات المختلفة فالرمز يحتاج بايتين لأن عدد الرموز أصبح خارج نطاق جدول الأسكي القياسي وأصبحنا نستطيع تمثيل جدول رموز يصل إلى 2 قوة 16 أي 65536 وهذا العدد كافي حتى للغة الصينية بل اللغات مجتمعة أيضا.

إذا لو وضعنا في المتغير من النوع نص قيمة نصية هي مثلا "abc" فسيكون حجم الذاكرة المحجوز هو 3 بايت

ولو كانت القيمة "Hello World" فيزداد الحجم إلى 11 بايت لأن الفراغ يعتبر رمز وله كود ويحتاج إلى بايت

يوجد عدة أنواع قياسية للمعطيات وهي المعرفة من قبل النظام والتي يشتهر استخدامها

ومنها الأرقام أو النصوص أو التاريخ والوقت أو الأرقام العشرية والتي تدعى الأرقام ذات الفاصلة العائمة وذلك لتمثيل الأرقام كقسمين جزء صحيح وجزء كسري وهذه النوع له الشكل القصير float و الشكل الطويل double و الفرق هو أن الثاني يحجز ضعف الأول من الذاكرة

وكذلك يوجد نوع للتمثيل المنطقي ويدعى bool أي Boolean وتعني القيم البوليانية والتي تمثل حالتين إما [نعم / لا] أو [صح / خطأ] أو [محدد/غير] محدد وبالتالي يكفيها بايت لتحتفظ بالقيمة 0 تعبيرا عن الحالة نعم أو true

والقيمة 1 للتعبير عن الحالة لا أو false

وهذا النوع نحتاجه من أجل تمثيل حالات مثل اختيار الخيارات أو نتيجة التحقق من الشرط و للتمثيل المنطقي للحصول على نتيجة لعدة قيم بوليانية كأن يكون الشرط هو نتيجة تحقق عدة شروط معا أو تحقق إحداها

وسيتضح ذلك أكثر عندما نبرمج بشكل عملي

أكتفي لهذا اليوم والسلام عليكم ورحمة الله وبركاته