27/01/2017
السلام عليكم مرحبا بكم في درس جديد من سلسلة تعلم لغة البرمجة سي.
---
في هذا الدرس سنتحدث عن انواع البيانات data types في لغة السي.
---
نحتاج لانواع البيانات للتعامل مع الذاكرة و نستعمل الانواع المختلفة للبيانات لاخبار المترجم او المفسر كيف نريد ان نستعمل البيانات و كل نوع له حجمه المخصص في الذاكرة ram و السي تدعم العديد من الانواع المختلفة مثل integer - boolean - float - double - char - wchar_t الخ..
---
------- int عدد صحيح حجمه 4 بايت
------- short عدد صحيح حجمه 2 بايت
------- long عدد صحيح حجمه 4 بايت
------- bool منطقي حجمه 1 بايت
------- char حرفي من جدول الاسكي حجمه 1بايت
------- wchar_t حرفي واسع من جدول اليونيكود حجمه 2 بايت
------- float عدد عشري حجمه 4 بايت
------- void نوع يمكن ان يستعمل مع كل الانواع
---
يمكن استخدام sizeof الذي يقوم بإرجاع حجم النوع النوع
---
printf("size of char iz : %d\n", sizeof(char));
---
عندما تقوم بتنفيد السطر السابق سينتج 1 اي ان حجم النوع حرفي char هو واحد بايت
---
يمكن إظافة signed أو unsigned قبل احد الانواع لكي نحدد هل النوع موجب ام سالب
---
نستخدم هده الانواع المختلفة في تعريف المتغيرات مثال:
---
Type Name = Value;
---
النوع Type يكون واحدا من الانواع الموجودة في لغة السي.
---
الاسم Name يكون اسم المتغير.
---
القيمة Value تكون قيمة المتغير مثلا قيمة المتغير من نوع int يجب ان تكون عددا صحيحا integer
---
ملاحظة :هناك فرق بين الاعلان و تعريف المتغيرات declaration and definition في التعريف نقوم بإعطاء المتغير قيمتا ابتدائية اما في الاعلان لا نقوم باعطائه اي قيمة ابتدائية.
---
int ix1; هذا اعلان
int ix2 = 120; هذا تعريف
---
نستخدم int في الاعلان عن متغيرات من نوع عدد صحيح integer مثال:
---
int ix = 22;
---
في هذا المثال قمنا بتعريف المتغير ix من نوع عدد صحيح integer الذي يحمل القيمة 22 و يكون حجم المتغير integer في الذاكرة 32bit او 4بايت اي انه يمكن ان يحمل قيمتا بين 2,147,483,647 الى -2,147,483,648 ,
في حالة اضفنا unsigned الى النوع int يكون المتغير موجبا يعني انه سيحمل قيمتا بين 0 الى 4,294,967,295
---
bool bx = true;
---
هنا قمت بتعريف متغير bx من نوع منطقي boolean يحمل القيمة true و النوع boolean يحمل القيمة true او false صحيح او خطأ حجمه 1بايت
---
char cx = 'A';
---
المتغير cx من نوع حرفي character و يحمل قيمتا من جدول الاسكي ascii table حجمه في الذاكرة 1 بايت
عندما نريد الاعلان عن مصفوفة نصية مثلا:
---
char x[10] = "AAAAAAAAA";
---
هنا قمنا بتعريف المصفوفة النصية x حجمها 10بايت ملاحظة قمنا بتخزين 9 احرف A فقط لان البايت العاشر يحمل القيمة 0 للدلالة على نهاية المصفوفة لان الدالة الخاصة بطباعة النصوص تقوم بمقارنة كل عنصر من المصفوفة بالصفر فعندما تجده تقوم بانهاء الطباعة.
السطر التالي خطأ:
---
char str[5] = "hello";
---
الكلمة hello حجمها 5بايت و المصفوفة النصية str لا يمكنها تخزين الا 4بايت اي ان دالة طباعة النصوص لن تجد الصفر و ستستمر في الطباعة
----
يمكننا تعريف المصفوفة السابقة على شكل
---
char str[5] = {'h','e','l','l','o','\0'};
---
في هذه الحالة قمنا بإضافة الصفر الى اخر المصفوفة الذي معناه عند طباعة النص عن طريق احد الدوال مثل printf ستجد الدالة الصفر في اخر المصفوفة و ستنهي الطباعة
---
يمكننا طباعة قيمة x مثلا عن طريق الذالة printf:
---
printf(str);
---
wchar_t wc = L'A';
---
في المثال السابق قمنا بتعريف المتغير wc من نوع حرفي واسع wide character الذي حجمه 2 بايت اي ان حجمه اكبر من char و نلاحظ الحرف L قبل الحرف A لكي نحصل على 2بايت في الذاكرة لكل حرف.
هكذا يبدو المتغير wc في الذاكرة :
---
41 00 00 00
A . . .
---
الرقم الستعشري 0x41 يقابله حرف A في جدول الاسكي
جدول الاسكي حجمه 128 و يحتوي على بعض الرموز و الابجدية اللتينية.
اما المتغير من نوع char فيبدو على هذا الشكل في الذاكرة
---
char cx = 'B';
42 00
B .
---
نلاحظ ان حجم المتغير من نوع char هو 1بايت اي انه قادر على تخزين 256 قيمة هذا يكفي لتخزين اي قيمة من جدول الاسكي لان حجمه 128 بايت ، ولكن جدول الاسكي لا يحتوي على جميع اللغات و الرموز لذا يجب تمديد الجدول لكي يظم كل اللغات و الرموز في العالم و هذا ما يسمى باليونيكود unicode الذي يستخدم 16 بت اي 2 بايت في تمثيل الحروف و الرموز لذا النوع wchar_t حجمه 2بايت اي 65,536 قيمة مختلفة لكي نتمكن من تخزين حروف اليونيكود.
---
جدول اسكي :
---
https://upload.wikimedia.org/wikipedia/commons/d/dd/ASCII-Table.svg
---
النوع void يعني لا توجد قيمة.
مثلا عند الاعلان عن دالة لا ترجع قيمة:
---
void func(int x);
---
هنا قمنا بالاعلان عن الدالة func التي لا ترجع اي قيمة و لهذا وضعت void قبل اسم الدالة لكي نخبر المترجم ان الدالة لا ترجع اي قيمة
---
int func1(void);
---
في هذا المثال الدالة func1 لا تأخد اي بارامتر لذالك وضعت void بين الاقواس و الدالة تقوم بإرجاع قيمة عدد صحيح integer لدلك وضعت int قبل اسم الدالة.
---
بقي لنا ان نتحدث عن type casting او التحويل من نوع الى اخر مثال عندنا متغير من نوع integer يحمل القيمة 74 في النظام العشري و اردنا تحويله الى حرفي او char مثال:
---
int ix = 74;
---
يمكننا تحويله بهذا الشكل :
---
char cx = (char)ix;
---
هنا قمنا بتعريف المتغير cx و هنا لا يمكن ان نسند اليه القيمة ix لانها من نوع مختلف و اذا حاولنا القيام باسناذ القيمة مباشرة فسيخبرنا المترجم انه لا يمكن تحويل من integer الى char بدون عمل type casting لذلك قمنا اولا بتحويل من integer الى character او حرفي بإظافة (char) قبل المتغير ix و الان المتغير cx سيحمل قيمة 74 في جدول الاسكي التي يقابلها حرف جي J uppercase.
---
---
الان وصلنا الى نهاية الدرس و اتمنى لكم فهم جيد و اي سؤال انا رهن الاشارة.
---
Jamal