Signed and unsigned numbers
Signed number هو الرقم اللي ممكن يكون موجب أو سالب ، لكن unsigned يعني موجب بس
رقم زي 7 مثلاً تمثيله Binary يبقى 111 ، أقل عدد من الـ bits ممكن نخزنه فيها هو 3
لو عايز تخزن رقم 8 اللي هو (1000) مينفعش تمثله في 3 bits ، هتحتاج على الأقل 4 bits عشان تخزنه فيهم
من الكلام ده نستنتج :
عدد ال bits بيحدد اقصى قيمة ممكن تتخزن فيها لما تضيف bit زيادة ، ممكن تخزن ضعف اللي ممكن تخزنه قبل ما تضيفها (مثلاً لو عندك 3 bit اقصى رقم ممكن تخزنه فيها هو 7 لو زوّدت bit بمعنى بقى عندك 4 bit هتلاقي اقصى رقم ممكن تخزنه بقى 8 )
نفترض ان عندنا 4 bits يبقى كل الاحتمالات اللي فيها كالتالي :
في الجدول اللي فات احنا اعتبرنا ان الارقام كلها Unsigned بمعنى ان كلها موجب ، في الحالة دي في 4 bit ممكن نخزن ارقام من 0 لغاية 15
طيب في حالة signed ؟ في طرق كتير لتمثيل الارقام اللي ممكن تكون موجب او سالب هنتكلم عن طريقة اسمها signed magnitude
الطريقة دي بتقول اننا نحجز آخر bit من الشمال و نسميها sign bit بحيث لو قيمة الـ bit دي بـ 0 يبقى الرقم موجب ، و لو قيمتها بـ 1 يبقى الرقم سالب ، فمثلاً لو عندنا 4 bit هنخلي اخر bit للاشارة و يبقى عندنا 3 bit نخزن فيها الارقام نفسها بالمنظر ده

هتلاحظ ان الـ range بدل ما كان في حالة الـ unsigned من 0 لـ 15 ، بقى في حالة الـ signed من -7 لـ 7 و ده بسبب اننا خدنا bit للتعبير عن الاشارة ، بمعنى الـ range قل للنص بس بقى ممكن تعد في اتجاهين
ملاحظة تانية هتلاقي عندك الصفر ظهر مرتين مرة صفر و مرة سالب صفر و ده طبعاً كده فيه تضييع لمساحة محتاجين نستغلها . طيب عشان نستغلها ممكن نقول انها بتعبر عن رقم تاني غير سالب صفر
نبص للقيمة كده : 1000 هتلاقي ان اخر بت اللي بتعبر عن الاشارة قيمتها 1 ده معناها ان الرقم سالب
فيبقى احسن لو خلينا القيمة دي تعبر عن رقم سالب
حاجة تانية ان عندك اصغر رقم سالب -7 فيستحسن نخليها تعبر عن الرقم اللي اصغر منه على طول عشان نبقى استفدنا من range كامل فنخليها تعبّر عن -8
معنى كده ان القيمة دي 1000 هنخليها تعبر عن الرقم -8 عشان نستغل المساحة دي و منكررش الصفر مرتين
هتلاحظ من الكلام اللي فات كله ان نفس الرقم ممكن يعبّر عن رقمين مختلفين بيتخلف من signed لـ unsigned
يعني مثلاً القيمة 1101 لو قلت ان ده unsigned يبقى بيعبر عن الرقم 13 و لو قلت انه signed يبقى بيعبّر عن الرقم -5
طيب الجهاز هيترجم القيمة دي على اساس انها 13 ولا -5 ؟
في الحقيقة انت اللي هتقوله ، هتحددله يتعامل معاها ازاي ، فلو قلتله اتعامل مع القيمة دي على انها signed number هيعرف انها -5 لكن لو قلتله انها unsigned هيتعامل معاها على انها 13
Numeric Overflow
تخيل انك عندك 2 bits عشان تخزّن فيهم ارقام
فلما تعد هتعد كده
لما وصلت لـ 11 افرض انك عايز تزّود 1 ؟ هتلاقي القيمة اللي بعدها 100 معناه ان محتاجbit كمان مش هتعرف تخزن الرقم كله في 2 bits ؟ طب لو زوّدت و انت في 2 bits ؟ هيخزن أول رقمين ع اليمين بس و اخر bit مش هيقدر يخزنها يعني بعد 11 هترجع لـ 00 تاني ، ده اسمه Numeric overflow
بمعنى تاني لو جيت تخزن رقم أكبر من الـ maximum اللي يقدر يخزّنه عدد معين من الـ bits بيحصل الـ numeric overflow
مثال تاني لو عندك رقم 4 و رقم 6 متخزنين في 3 bits و عايز تجمعهم و تخزن الناتج برضه في 3 bits نشوف ايه اللي هيحصل
4 ممكن تتخزن في 3 bits و برضه 6 تتخزن في 3bits لما تجمعهم الناتج هيبقى 10 اللي هو بيتمثل 1010 يعني 4 bits فلو عايز تخزنه في 3 bits هياخد اول 3 bits ع اليمين بس ، فهيطلع ناتج الجمع غلط اللي هو 2 مش 10
الارقام الكسرية
في النظام العشري نعرف نمثل الارقام الكسرية 159.5
الجزء اللي قبل العلامة ع الشمال هو الجزء الصحيح ، الجزء اللي على يمين العلامة هو الجزء الكسري
لاحظ ان القيم المكانية للارقام على يمين العلامة هي مقلوب القيمة المكانية للأرقام على شمال العلامة
نفس الكلام في الـ binary
مثلاً رقم زي ده
ده لو هنحوله decimal يبقى كده
1x4 + 1x2 + 1x1 + 1x(1/2) = 7.5
فيه ارقام زي 0.1 متقدرش تجيب قيمة بالظبط ليها لكن ممكن تجيب قيمة تقريبية ليها ، و كل ما زوّدت عدد الـ bits بعد العلامة تزيد الدقة
مثلاً 0.1 ممكن نحوله binary كده
ده هيكون حوالي 0.09 و هي قيمة قريبة من 0.1 ممكن تزود عدد الـ Bits و توصل لقيمة اقرب
تخزين الارقام الكسرية في الكمبيوتر بيخزن الرقم كله على بعضه ، من غير تخزين العلامة ، و بتعرّفه عدد الارقام اللي قبل العلامة و عدد الارقام بعد العلامة
الجزء اللي قبل العلامة ع الشمال هو الجزء الصحيح ، الجزء اللي على يمين العلامة هو الجزء الكسري
لاحظ ان القيم المكانية للارقام على يمين العلامة هي مقلوب القيمة المكانية للأرقام على شمال العلامة
نفس الكلام في الـ binary
مثلاً رقم زي ده
ده لو هنحوله decimal يبقى كده
1x4 + 1x2 + 1x1 + 1x(1/2) = 7.5
فيه ارقام زي 0.1 متقدرش تجيب قيمة بالظبط ليها لكن ممكن تجيب قيمة تقريبية ليها ، و كل ما زوّدت عدد الـ bits بعد العلامة تزيد الدقة
مثلاً 0.1 ممكن نحوله binary كده
ده هيكون حوالي 0.09 و هي قيمة قريبة من 0.1 ممكن تزود عدد الـ Bits و توصل لقيمة اقرب
تخزين الارقام الكسرية في الكمبيوتر بيخزن الرقم كله على بعضه ، من غير تخزين العلامة ، و بتعرّفه عدد الارقام اللي قبل العلامة و عدد الارقام بعد العلامة
Numeric data types in C
عشان تخزن رقم ، لازم تعرف حاجتين
المساحة اللي هتحتاجها عشان تخزن الرقم
ايه نوع الرقم اللي هتخزنه
هنتكلم الأول عن أنواع الارقام في الـ c
بالنسبة للـ size فيه حاجة اسمها size modifiers وليها نوعين short , long
مثال :
Unsigned short int number = 10;
Unsigned موجب
Short هيتخزن في مساحة صغيرة
Int عدد صحيح
Number اسم المتغير
10 قيمة المتغير
Char and ASCII
اتكلمنا عن الارقام ، فيه data type تاني بيستخدم عشان يخزن حروف اسمه char
غالباً بيتخزن في 1 byte يعني 8 bit
كل حرف موجود على الـ Keyboard سواء كان رقم أو حرف أو special character الجهاز بيتعامل معاه أولاً على انه character و كل character ليه code معين على حسب نوع الـ encoding المستخدم ، احنا هنا هنتكلم عن ASCII Encoding
بيخزن الحروف و الارقام دي ازاي ؟ كل رقم او حرف بيبقى ليه كود معين من 8 bits
مثلاً الـحروف الـ capital الـ code بتاعها كده
و ال small بتاعتها كده
لو دققنا في الجدولين هنلاقي شوية ملاحظات :-
1-كل حرف بيتمثل في 8 bits
2-الحروف الـ capital بيكون فيها أول 3 bits من الشمال دايماً 010 بعد كده الـ 5 bits الباقيين بتعبر عن ارقام من 1 لغاية 26
3-الحروف الـ small بيكون فيها اول 3 bits من الشمال دايماً 011 بعد كده الـ 5 bits الباقيين بيعبروا عن الارقام من 1 لغاية 26
4-لو دققنا في اول 3 bits من الشمال في الحروف الـ capital و ال small هنلاقي ان الـ bit رقم 3 بتكون 0 لما يكون الحرف capital و بتكون 1 لما يكون الحرف small
Numbers as characters in ASCII
قلنا قبل كده انك لما تضغط على اي حاجة على keyboard بيتعامل معاها على انها char ، نفس الحكاية مع الارقام
مثال:
ملاحظات :-
1-كل الارقام (الممثلة كـ Characters ) اول 4 bits ع الشمال بيكونوا دايماً 0011 و بعد كده الـ 4 bits اللي بعدهم بتكون قيمة الرقم الحقيقة من 0000 لغاية 1001
2-قيمة الـ char number مش هي نفسها قيمة الرقم الحقيقة يعني مثلاً
لأن ‘6’ بتكون 0011 0110 في حين ان 6 بتكون 0000 0110
يعني لو عايز تحول من ‘6’ لـ 6 لازم تخلي اول 4-bits من الشمال أصفار
2-قيمة الـ char number مش هي نفسها قيمة الرقم الحقيقة يعني مثلاً
‘6’ لا تساوي 6
لأن ‘6’ بتكون 0011 0110 في حين ان 6 بتكون 0000 0110
يعني لو عايز تحول من ‘6’ لـ 6 لازم تخلي اول 4-bits من الشمال أصفار





شكرا على المقالة ،
ردحذفملاحظة صغيرة :
ممكن لو عايز احول من '6' لـ 6 اعمل كدة >> '0' - '6'
صح يا اتش
حذفو ده كان سؤال في اول assignment
:)
أزال المؤلف هذا التعليق.
ردحذف