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