وليد الشهري
وليد الشهري

@Waleed_S_7

19 تغريدة 15 قراءة Nov 01, 2022
لكل نوع بيانات (data type) مدى (range) معين، وهذا يعتمد على عدد البِت (bits) المحجوز له مسبقًا.. بالنظر إلى الصورة المرفقة، تتبين لنا تفاصيل أشهر أنواع البيانات في لغات البرمجة المختلفة.. فما معنى هذا الكلام؟
كمثال، لنتناول النوع "int" بالتحليل في هذه السلسلة، حتى نفهم الفكرة..
عدد البتّات (bits) المحجوزة للنوع "int" هي: 32.
وإذا أردنا حساب المساحة بالبايت (byte)، فنحن نعلم أنّ البايت الواحد يساوي 8 بِت، وعليه، فإنّ:
32 bit / 8 bit = 4 byte.
ولكن من المهم أن نسلّط التركيز على الحساب بالبِت (bit) حتى تتضح الصورة أكثر..
تخيّل لو كان لديك 32 خانة، ولا تستطيع أن تملأ كل خانة إلّا بأحد رقمين فقط، إما "0" أو "1"، فكم يمكن لهذا العدد من الخانات أن يمثّل من الأرقام العشريّة؟ أو بعبارة أخرى: كم تشكيل فريد (غير متكرر) من الواحدات والأصفار يمكن أن تملأ به الخانات ال 32؟
بما أنّي لا أملك غير خيارين لتعبئة الخانة الواحدة (إما 0 أو 1)، فإن الأساس هو العدد 2 (أساس نظام العد الثنائي)، وبما أنّ عدد الخانات في هذه الحالة هو 32، إذن فإنّ حساب الأرقام التي يمكن تمثيلها يكون بإيجاد ناتج العملية الرياضيّة الظاهرة في الصورة..
وناتج العملية هو:
4,294,967,296
لكن النتيجة تختلف عمّا هو موجود في الصورة المرفقة بالتغريدة الأولى، إذ كانت (بصرف النظر عن العدد السالب):
2,147,483,647
فأين الخلل؟!
في الحقيقة، الناتج الذي كتبناه صحيح، لكنّ الظاهر في الصورة هو الأصح.. لماذا؟ لأنّ الرقم الظاهر في الصورة هو ناتج عمليّة:
2 أُس 31
وليس:
2 أُس 32
بمعنى أنّ هناك بِت (bit) واحد تم استبعاده من الحسبة!!
والسبب ببساطة هو أنّ ذلك البِت المستبعَد مخصّص لتمثيل إشارة العدد فقط (sign bit)، فإذا كان موجبًا يتم تمثيله بالعدد "0"، وإذا كان سالبًا يتم تمثيله بالعدد "1".
ولا يجب أن ننسى اشتمال مجموعة الأعداد الصحيحة رياضيًّا على السالب والموجب، وهذا هو الدور الذي يلعبه النوع "int".
والآن، لو حسبنا ناتج العملية "2 أُس 31"، سيكون الناتج:
2,147,483,648
وهو مطابق للعدد السالب الظاهر في الصورة المرفقة بالتغريدة الأولى، لكنه ينقص عن العدد الموجب بمقدار 1 فقط:
from:
- 2,147,483,648
to:
2,147,483,647
لماذا نقص العدد الموجب بمقدار 1 ؟!
السبب هو أنّ الحاسب دائمًا يبدأ العد من الصفر وليس الواحد كما نفعل في حياتنا اليومية باستخدام نظامنا العشري..
عدد الأقلام في الصورة هو 5 من منظورك كإنسان (1,2,3,4,5)، لكنه 4 من منظور الحاسب (0,1,2,3,4)، وكلاكما على صواب.
تمثيل العدد صفر في 32 بِت كما يلي:
0000 0000 0000 0000 0000 0000 0000 0000
وحتى نمثّل العدد "-1" فيكفي أن تتغيّر إشارة البِت الموجود في أقصى اليسار (وهو الخاص بتمثيل إشارة العدد فقط كما ذكرنا) إلى "1" بدلًا من "0":
0000 0000 0000 0000 0000 0000 0000 1000
العدد صفر محسوب على الأعداد الموجَبة (رغم أنّه محايد رياضيًّا، أي لا يحمل إشارة)، لذلك كان مدى النوع "int" ناقصًا 1 في الرقم الموجب.
وعندما غيّرنا فقط البِت الخاص بتمثيل الإشارة إلى "1"، فقد تقرّر تمثيله بالعدد العشري "-1"، لأنّ الصفر لا يمكن تمثيله بالسالب..
ولهذا ظهر الرقم السالب مطابقًا لناتج العمليّة: 2 أُس 31.
جرّب أن تنشئ متغيّرًا تكون قيمته خارج المدى المسموح لنوع البيانات بالموجب أو السالب، وسوف يحدث ما يسمّى بالفيضان أو التجاوز (overflow)، ينتج عنه مخرجات غير صحيحة، بالإضافة إلى تحذير (warning) أو خطأ (error).
يُذكَر أنّ منصّة "youtube" الشهيرة قد تورّطت في هذا النوع من المشكلات، عندما جعلت عدد المشاهدات ضمن نطاق "int"، ولم تكن تتوقّع أن يتجاوز عدد المشاهدات 2 مليار في أحسن الأحوال، حتى جاءت الأغنية المعروفة "gangnam style" لتحطّم التوقّعات، وتضع "youtube" في مأزق مع "overflow"!!
كما أنّ العالم على موعد مع أزمة مشابهة في تاريخ:
19 يناير 2038، الساعة 3:14:07 بتوقيت جرينيتش.
والسبب هو عدم قدرة الحواسيب على تمثيل الوقت بشكل صحيح بعد هذا الموعد (سنعود إلى بداية القرن العشرين)، نظرًا لتجاوز الحد المسموح به في نطاق 32 بِت، وهي مشكلة معروفة باسم:
2038 problem.
أو:
Y2K38
وعلى كل حال، فهي مشكلة قابلة للتدارك ولا تستدعي القلق.
وقد سبقتها مشكلة محتمَلة من دخول العام 2000، حيث أعرب الكثير من المتخصصين وغيرهم عن تخوّفهم من دخول الألفية الثالثة دون معالجة المشكلة المتعلّقة بتمثيل السنة في الحواسيب، فقد كان تمثيلها مقصورًا على عددين فقط (على سبيل المثال: بدلًا من كتابة السنة بهذا الشكل 1987، تُكتَب 87 فقط).
وعمومًا، فالمشكلات المتعلّقة بالوقت تشكّل خطرًا حقيقيًّا على البنية التحتيّة بأكملها فيما لو تحقّقت بالفعل، خصوصًا وأنّ الاعتماد على الحواسيب بات واقعًا يفرض نفسه أكثر وأكثر على الجميع من أفراد ومؤسسات.
ولعلّي أفرد الحديث لاحقًا عن مشكلات التوقيت المذكورة.. بالمناسبة، حاول أن تتلاعب بإعدادات التاريخ في جهازك، وتجعله - مثلًا - يتجاوز العام 2038، في الغالب لن تتمكّن من ذلك!
إلى هنا تنتهي السلسلة، وأرجو أن تكون واضحة بما فيه الكفاية - على الأقل -.
انتهى.

جاري تحميل الاقتراحات...