أنواع البيانات C
| مكتبة سي القياسية (libc) |
|---|
| المواضيع العامة |
| عناوين متنوعة |
في لغة البرمجة C ، تشكل أنواع البيانات الدلالات والخصائص الخاصة بتخزين عناصر البيانات. ويتم التعبير عنها في بناء الجملة اللغوية في شكل إعلانات لمواقع الذاكرة أو المتغيرات . كما تحدد أنواع البيانات أنواع العمليات أو طرق معالجة عناصر البيانات.
توفر لغة C أنواعًا حسابية أساسية، مثل أنواع الأعداد الصحيحة والحقيقية ، والنحو لبناء أنواع المصفوفات والمركبة. تحتوي عناوين مكتبة C القياسية ، التي سيتم استخدامها عبر توجيهات التضمين ، على تعريفات لأنواع الدعم، التي لها خصائص إضافية، مثل توفير مساحة تخزين بحجم دقيق، بغض النظر عن تنفيذ اللغة على منصات الأجهزة المحددة. [1] [2]
الأنواع الأولية
الأنواع الرئيسية
توفر لغة C أربعة مواصفات أساسية لنوع الحساب وهي char و int و float و double ، بالإضافة إلى المحددات signed و unsigned و short و long . يسرد الجدول التالي التركيبات المسموح بها في تحديد مجموعة كبيرة من الإعلانات الخاصة بحجم التخزين.
| يكتب | توضيح | الحجم الأدنى (بت) | محدد التنسيق | يتراوح | لاحقة للثوابت العشرية |
|---|---|---|---|---|---|
| حرف | أصغر وحدة قابلة للعنونة في الجهاز يمكن أن تحتوي على مجموعة أحرف أساسية. وهي نوع عدد صحيح . يمكن أن يكون النوع الفعلي إما موقّعًا أو غير موقّع. وهي تحتوي على بتات CHAR_BIT. [3] | 8 | %c |
[ الحد الأدنى ، الحد الأقصى ] | — |
| شخصية موقعة | بنفس حجم char ، ولكن من المؤكد أنه موقّع. قادر على احتواء النطاق [−127، +127] على الأقل . [3] [أ] | 8 | %c[ب] |
[ SCHAR_MIN , SCHAR_MAX ] [6] | — |
| حرف غير موقّع | بنفس حجم char ، ولكن من المؤكد أنه غير موقّع. يحتوي على نطاق [0, 255] على الأقل . [7] | 8 | %c[ج] |
[0, UCHAR_MAX ] | — |
|
نوع عدد صحيح قصير موقّع. قادر على احتواء [ على الأقل-32767 ،+32 767 ] النطاق. [3] [أ] | 16 | %hiأو%hd |
[ الحد الأدنى للسرعة ، الحد الأقصى للسرعة ] | — |
|
نوع عدد صحيح قصير غير موقّع. يحتوي على الأقل على [0 ,65 535 ] المدى. [3] | 16 | %hu |
[0, USHRT_MAX ] | — |
|
نوع عدد صحيح أساسي موقّع. قادر على احتواء [ على الأقل-32767 ،+32 767 ] النطاق. [3] [أ] | 16 | %iأو%d |
[ INT_MIN , INT_MAX ] | لا شيء [8] |
|
نوع عدد صحيح غير موقّع أساسي. يحتوي على الأقل على [0 ,65 535 ] المدى. [3] | 16 | %u |
[0, UINT_MAX ] | u أو U [8] |
|
نوع عدد صحيح طويل موقّع. قادر على احتواء [ على الأقل-2 147 483 647 ،+2 147 483 647 ] النطاق. [3] [أ] | 32 | %liأو%ld |
[ الحد الأدنى الطويل ، الحد الأقصى الطويل ] | ل أو ل [8] |
|
نوع عدد صحيح طويل غير موقّع. قادر على احتواء [ على الأقل0 ,4 294 967 295 ] النطاق. [3] | 32 | %lu |
[0, أولونج_ماكس ] | كل من u أو U و l أو L [8] |
|
نوع عدد صحيح طويل ومميز. قادر على احتواء [ على الأقل−9 223 372 036 854 775 807 ،+9 223 372 036 854 775 807 ] النطاق. [3] [أ] تم تحديده منذ إصدار C99 من المعيار. | 64 | %lliأو%lld |
[ الحد الأدنى للطول ، الحد الأقصى للطول ] | ll أو LL [8] |
|
نوع عدد صحيح طويل غير موقّع. يحتوي على الأقل على [0 ,18 446 744 073 709 551 615 ] النطاق. [3] تم تحديده منذ إصدار C99 من المعيار. | 64 | %llu |
[0, أولونج_ماكس ] | كل من u أو U و ll أو LL [8] |
| يطفو | نوع الفاصلة العائمة الحقيقي، ويشار إليه عادةً باسم نوع الفاصلة العائمة أحادي الدقة. الخصائص الفعلية غير محددة (باستثناء الحدود الدنيا)؛ ومع ذلك، في معظم الأنظمة، هذا هو تنسيق الفاصلة العائمة الثنائي أحادي الدقة IEEE 754 (32 بت). هذا التنسيق مطلوب بموجب الملحق F الاختياري "حسابات الفاصلة العائمة IEC 60559". | التحويل من النص: [د]
|
ف أو ف | ||
| مزدوج | نوع الفاصلة العائمة الحقيقي، ويشار إليه عادةً باسم نوع الفاصلة العائمة ذي الدقة المزدوجة. الخصائص الفعلية غير محددة (باستثناء الحدود الدنيا)؛ ومع ذلك، في معظم الأنظمة، هذا هو تنسيق الفاصلة العائمة الثنائي ذي الدقة المزدوجة IEEE 754 (64 بت). هذا التنسيق مطلوب بموجب الملحق F الاختياري "حسابات الفاصلة العائمة IEC 60559". |
|
لا أحد | ||
| طويل مزدوج | نوع الفاصلة العائمة الحقيقي، عادة ما يتم تعيينه إلى تنسيق رقم الفاصلة العائمة بدقة ممتدة . الخصائص الفعلية غير محددة. يمكن أن يكون إما تنسيق الفاصلة العائمة بدقة ممتدة x86 (80 بت، ولكن عادةً 96 بت أو 128 بت في الذاكرة مع بايتات الحشو )، أو تنسيق الفاصلة العائمة " double-double " غير التابع لـ IEEE (128 بت)، أو تنسيق الفاصلة العائمة بدقة رباعية IEEE 754 (128 بت)، أو نفس تنسيق double. راجع المقال حول long double للحصول على التفاصيل. | %Lf %LF%Lg %LG%Le %LE%La %LA[هـ] |
ل أو ل |
- ^ abcde تأتي النطاقات الدنيا [−(2 n −1 −1)، 2 n −1 −1] (على سبيل المثال [−127,127]) من التمثيلات الصحيحة المتنوعة المسموح بها بالمعيار ( مكمل الواحدات ، ومقدار الإشارة ، ومكمل الاثنين ). [4] ومع ذلك، تستخدم معظم المنصات مكمل الاثنين، مما يعني نطاقًا من النموذج [−2 m −1 ، 2 m −1 −1] مع m ≥ n لهذه التنفيذات، على سبيل المثال [−128,127] (
SCHAR_MIN == −128و ) لحرف موقّعSCHAR_MAX == 127مكون من 8 بتات . منذ C23، فإن التمثيل الوحيد المسموح به هو مكمل الاثنين، وبالتالي تتراوح القيم من [−2 n −1 ، 2 n −1 −1] على الأقل . [5] - ^ أو
%hhiللإخراج الرقمي - ^ أو
%hhuللإخراج الرقمي - ^ توجد سلاسل التنسيق هذه أيضًا لتنسيق النص، ولكنها تعمل على شكل مزدوج.
- ^ ab تختلف الأحرف الكبيرة عن الأحرف الصغيرة في الإخراج. تنتج مواصفات الأحرف الكبيرة قيمًا بالأحرف الكبيرة والأحرف الصغيرة بالأحرف الصغيرة (%A و%E و%F و%G تنتج قيمًا مثل INF وNAN وE (الأس) بالأحرف الكبيرة)
يختلف الحجم الفعلي لأنواع الأعداد الصحيحة حسب التنفيذ. يتطلب المعيار فقط علاقات الحجم بين أنواع البيانات والحد الأدنى للأحجام لكل نوع بيانات:
متطلبات العلاقة هي أن long longلا يكون حجمها أصغر من long ، والذي لا يكون أصغر من int ، والذي لا يكون أصغر من short . نظرًا لأن حجم char هو دائمًا الحد الأدنى لنوع البيانات المدعوم، فلا يمكن أن يكون حجم أي نوع بيانات آخر (باستثناء حقول البت ) أصغر.
الحد الأدنى لحجم char هو 8 بت، والحد الأدنى لحجم short و int هو 16 بت، والحد الأدنى لحجم long هو 32 بت ويجب أن يحتوي على 64 بت على الأقل.
long long
يجب أن يكون النوع int هو النوع الصحيح الذي يعمل معه المعالج المستهدف بكفاءة أكبر. وهذا يسمح بمرونة كبيرة: على سبيل المثال، يمكن أن تكون جميع الأنواع 64 بت. ومع ذلك، فإن العديد من مخططات عرض الأعداد الصحيحة المختلفة (نماذج البيانات) شائعة. ولأن نموذج البيانات يحدد كيفية تواصل البرامج المختلفة، يتم استخدام نموذج بيانات موحد داخل واجهة تطبيق نظام التشغيل المعينة. [9]
في الممارسة العملية، يكون حجم char عادةً 8 بتات ويكون حجم short عادةً 16 بتًا (كما هي الحال مع نظيراتها غير الموقعة). وينطبق هذا على منصات متنوعة مثل SunOS 4 Unix في التسعينيات، وMicrosoft MS-DOS ، و Linux الحديث ، وMicrochip MCC18 لوحدات التحكم الدقيقة PIC المضمنة ذات 8 بتات . يتطلب POSIX أن يكون حجم char 8 بتات بالضبط. [10] [11]
تجعل القواعد المختلفة في معيار C unsigned charالنوع الأساسي المستخدم في المصفوفات مناسبًا لتخزين كائنات عشوائية غير حقل بت: افتقاره إلى بتات الحشو وتمثيلات الفخ، وتعريف تمثيل الكائن ، [7] وإمكانية التضليل. [12]
يختلف الحجم والسلوك الفعليان لأنواع الفاصلة العائمة أيضًا حسب التنفيذ. المتطلب الوحيد هو long doubleألا يكون أصغر من double ، والذي لا يكون أصغر من float . عادةً، يتم استخدام تنسيقات الفاصلة العائمة الثنائية IEEE 754 ذات 32 بت و64 بت لـ float و double على التوالي.
يتضمن معيار C99 أنواعًا جديدة من الفاصلة العائمة الحقيقية float_t و double_t ، والتي تم تعريفها في . وهي تتوافق مع الأنواع المستخدمة للنتائج الوسيطة لتعبيرات الفاصلة العائمة عندما تكون FLT_EVAL_METHOD 0 أو 1 أو 2. وقد تكون هذه الأنواع أوسع من .
<math.h>long double
أضافت C99 أيضًا أنواعًا معقدةfloat _Complex : , double _Complex, long double _Complex. وأضافت C11 أنواعًا وهمية (تم وصفها في ملحق إعلامي لـ C99): ,float _Imaginary , double _Imaginary. يسمح long double _Imaginaryتضمين الرأس <complex.h>بالوصول إلى كل هذه الأنواع باستخدام معقدة وخيالية على التوالي.
نوع منطقي
أضافت C99 نوع بيانات منطقي _Bool . بالإضافة إلى ذلك، <stdbool.h>يحدد الرأس boolاسمًا مستعارًا مناسبًا لهذا النوع، كما يوفر وحدات ماكرو لوظائف trueو false. _Boolبشكل مشابه لنوع عدد صحيح عادي، باستثناء واحد: أي تعيينات لـ a _Boolليست 0 (خطأ) يتم تخزينها على أنها 1 (صواب). يوجد هذا السلوك لتجنب تجاوزات الأعداد الصحيحة في التحويلات الضيقة الضمنية. على سبيل المثال، في الكود التالي:
حرف غير موقّع b = 256 ؛
إذا ( ب ) { /* افعل شيئًا */ }
يتم تقييم المتغير bعلى أنه خطأ إذا unsigned charكان حجمه 8 بتات. وذلك لأن القيمة 256 لا تتناسب مع نوع البيانات، مما يؤدي إلى استخدام البتات الثمانية الأدنى منه، مما يؤدي إلى قيمة صفرية. ومع ذلك، يؤدي تغيير النوع إلى جعل الكود السابق يتصرف بشكل طبيعي:
_بول ب = 256 ؛
إذا ( ب ) { /* افعل شيئًا */ }
يضمن النوع _Bool أيضًا مقارنة القيم الصحيحة دائمًا مع بعضها البعض:
_بولي أ = 1 ، ب = 2 ؛
إذا ( أ == ب ) { /*سيتم تشغيل هذا الكود */ }
أنواع الأعداد الصحيحة الدقيقة
منذ C23 ، تسمح اللغة للمبرمج بتعريف أعداد صحيحة لها عرض عدد عشوائي من البتات. يتم تحديد هذه الأنواع على النحو التالي ، حيث N هو تعبير ثابت عدد صحيح يدل على عدد البتات، بما في ذلك بت الإشارة للأنواع الموقعة، الممثلة في المكمل الثاني. يتم توفير القيمة القصوى لـ N بواسطة و هي على الأقل . لذلك، يأخذ النوع (أو ) قيمًا من −2 إلى 1 بينما يأخذ قيمًا من 0 إلى 3. النوع موجود أيضًا، إما 0 أو 1 وليس له نوع موقع مكافئ. [13]_BitInt(N)BITINT_MAXWIDTHULLONG_WIDTH_BitInt(2)signed _BitInt(2)unsigned _BitInt(2)unsigned _BitInt(1)
أنواع الاختلافات بين الحجم والمؤشر
تتضمن مواصفات لغة C نوعي البيانات s و لتمثيل الكميات المرتبطة بالذاكرة. يتم تحديد حجمها وفقًا للقدرات الحسابية للمعالج المستهدف، وليس قدرات الذاكرة، مثل مساحة العنوان المتاحة. يتم تعريف كلا النوعين في العنوان ( في C++).
size_tptrdiff_t<stddef.h>cstddef
size_tهو نوع عدد صحيح غير موقّع يستخدم لتمثيل حجم أي كائن (بما في ذلك المصفوفات) في التنفيذ المعين. يعطي عامل التشغيل sizeof قيمة من النوع . يتم توفير الحجم الأقصى لـ عبر ، وهو ثابت ماكرو يتم تعريفه في الرأس ( الرأس في C++). من المضمون أن يكون عرضه 16 بت على الأقل. بالإضافة إلى ذلك، يتضمن POSIX ، وهو نوع عدد صحيح موقّع بنفس عرض .
size_tsize_tSIZE_MAX<stdint.h>cstdintsize_tssize_tsize_t
ptrdiff_tهو نوع عدد صحيح موقّع يستخدم لتمثيل الفرق بين المؤشرات. ومن المؤكد أنه صالح فقط للمؤشرات من نفس النوع؛ ويتم تحديد طرح المؤشرات المكونة من أنواع مختلفة من خلال التنفيذ.
واجهة لخصائص الأنواع الأساسية
يتم توفير معلومات حول الخصائص الفعلية، مثل الحجم، لأنواع الحساب الأساسية، من خلال ثوابت الماكرو في رأسين: يحدد <limits.h>الرأس ( climitsheader في C++) وحدات الماكرو لأنواع الأعداد الصحيحة ويحدد <float.h>الرأس ( cfloatheader في C++) وحدات الماكرو لأنواع الفاصلة العائمة. تعتمد القيم الفعلية على التنفيذ.
خصائص أنواع الأعداد الصحيحة
CHAR_BIT- حجم نوع الحرف بالبتات، ويشار إليه عادةً بحجم البايت ( 8 بتات على الأقل)SCHAR_MIN,SHRT_MIN,INT_MIN,LONG_MIN,LLONG_MIN(C99) - الحد الأدنى الممكن لقيمة أنواع الأعداد الصحيحة الموقعة: signed char، signed short، signed int، signed long، signed long longSCHAR_MAX,SHRT_MAX,INT_MAX,LONG_MAX,LLONG_MAX(C99) - الحد الأقصى للقيمة الممكنة لأنواع الأعداد الصحيحة الموقعة: signed char، signed short، signed int، signed long، signed long longUCHAR_MAX,USHRT_MAX,UINT_MAX,ULONG_MAX,ULLONG_MAX(C99) - أقصى قيمة ممكنة لأنواع الأعداد الصحيحة غير الموقعة: unsigned char، unsigned short، unsigned int، unsigned long، unsigned long longCHAR_MIN- الحد الأدنى لقيمة char الممكنةCHAR_MAX- أقصى قيمة ممكنة للحرفMB_LEN_MAX- الحد الأقصى لعدد البايتات في حرف متعدد البايتاتBOOL_WIDTH(C23) - عرض البت_Bool، دائمًا 1CHAR_WIDTH(C23) - عرض البتchar؛CHAR_WIDTH،UCHAR_WIDTHوتساويSCHAR_WIDTHحسبCHAR_BITالتعريفSCHAR_WIDTH,SHRT_WIDTH,INT_WIDTH,LONG_WIDTH,LLONG_WIDTH(C23) - عرض البتsigned char,short,int,long, وlong longعلى التواليUCHAR_WIDTH,USHRT_WIDTH,UINT_WIDTH,ULONG_WIDTH,ULLONG_WIDTH(C23) - عرض البتunsigned char,unsigned short,unsigned int,unsigned long, وunsigned long longعلى التوالي
خصائص أنواع الفاصلة العائمة
FLT_MIN,DBL_MIN,LDBL_MIN– الحد الأدنى للقيمة الإيجابية الطبيعية لـ float وdouble وlong double على التواليFLT_TRUE_MIN,DBL_TRUE_MIN,LDBL_TRUE_MIN(C11) - الحد الأدنى للقيمة الإيجابية لـ float وdouble وlong double على التواليFLT_MAX,DBL_MAX,LDBL_MAX– الحد الأقصى للقيمة المحدودة للعدد float، والعدد double، والعدد long double، على التواليFLT_ROUNDS- وضع التقريب لعمليات الفاصلة العائمةFLT_EVAL_METHOD(C99) - طريقة تقييم التعبيرات التي تتضمن أنواعًا مختلفة من الفاصلة العائمةFLT_RADIX- أساس الأس في أنواع الفاصلة العائمةFLT_DIG,DBL_DIG,LDBL_DIG– عدد الأرقام العشرية التي يمكن تمثيلها دون فقدان الدقة عن طريق float وdouble وlong double على التواليFLT_EPSILON,DBL_EPSILON,LDBL_EPSILON– الفرق بين 1.0 والقيمة القابلة للتمثيل التالية لـ float وdouble وlong double على التواليFLT_MANT_DIG,DBL_MANT_DIG,LDBL_MANT_DIG– عددFLT_RADIXالأرقام الأساسية في الفاصلة العائمة للأنواع float وdouble وlong double على التواليFLT_MIN_EXP,DBL_MIN_EXP,LDBL_MIN_EXP– الحد الأدنى لعدد صحيح سلبي بحيثFLT_RADIXيكون مرفوعًا إلى قوة أقل من هذا الرقم واحدًا هو عدد عشري طبيعي، مزدوج، مزدوج طويل، على التواليFLT_MIN_10_EXP,DBL_MIN_10_EXP,LDBL_MIN_10_EXP– الحد الأدنى لعدد صحيح سلبي بحيث يكون 10 مرفوعًا إلى هذا الأس عددًا عشريًا طبيعيًا، مزدوجًا، مزدوجًا طويلًا، على التواليFLT_MAX_EXP,DBL_MAX_EXP,LDBL_MAX_EXP– أقصى عدد صحيح موجب بحيث يكونFLT_RADIXمرفوعًا إلى قوة أقل من هذا الرقم واحدًا هو عدد عشري طبيعي، مزدوج، مزدوج طويل، على التواليFLT_MAX_10_EXP,DBL_MAX_10_EXP,LDBL_MAX_10_EXP– أقصى عدد صحيح موجب بحيث يكون 10 مرفوعًا إلى هذا الأس عددًا عشريًا طبيعيًا، مزدوجًا، مزدوجًا طويلًا، على التواليDECIMAL_DIG(C99) - الحد الأدنى لعدد الأرقام العشرية بحيث يمكن تمثيل أي عدد من أوسع أنواع الفاصلة العائمة المدعومة في عدد عشري بدقةDECIMAL_DIGأرقام وقراءته مرة أخرى بنوع الفاصلة العائمة الأصلي دون تغيير قيمته.DECIMAL_DIGهو 10 على الأقل.
أنواع الأعداد الصحيحة ذات العرض الثابت
يتضمن معيار C99 تعريفات لعدة أنواع جديدة من الأعداد الصحيحة لتعزيز قابلية نقل البرامج. [2] اعتُبرت أنواع الأعداد الصحيحة الأساسية المتاحة بالفعل غير كافية، لأن أحجامها الفعلية محددة بالتنفيذ وقد تختلف عبر أنظمة مختلفة. تعد الأنواع الجديدة مفيدة بشكل خاص في البيئات المضمنة حيث تدعم الأجهزة عادةً عدة أنواع فقط ويختلف هذا الدعم بين البيئات المختلفة. يتم تعريف جميع الأنواع الجديدة في <inttypes.h>header ( cinttypesheader في C++) وهي متوفرة أيضًا في <stdint.h>header ( cstdintheader في C++). يمكن تجميع الأنواع في الفئات التالية:
- أنواع الأعداد الصحيحة ذات العرض الدقيق والتي تضمن أن يكون لها نفس عدد البتات n في جميع التنفيذات. يتم تضمينها فقط إذا كانت متاحة في التنفيذ.
- أنواع الأعداد الصحيحة ذات العرض الأقل والتي من المؤكد أنها أصغر نوع متاح في التنفيذ، والتي تحتوي على عدد محدد على الأقل من البتات. ومن المؤكد أن يتم تحديدها على الأقل لـ N=8,16,32,64.
- أسرع أنواع الأعداد الصحيحة التي يُضمن أنها أسرع أنواع الأعداد الصحيحة المتاحة في التنفيذ، والتي تحتوي على عدد محدد على الأقل من البتات. ويُضمن تحديدها على الأقل لـ N=8,16,32,64.
- أنواع الأعداد الصحيحة للمؤشرات التي من المؤكد أنها قادرة على الاحتفاظ بمؤشر. يتم تضمينها فقط إذا كانت متاحة في التنفيذ.
- أنواع الأعداد الصحيحة ذات العرض الأقصى التي من المؤكد أنها أكبر نوع عدد صحيح في التنفيذ.
يوضح الجدول التالي ملخصًا للأنواع والواجهة للحصول على تفاصيل التنفيذ ( يشير n إلى عدد البتات):
| نوع الفئة | أنواع موقعة | أنواع غير موقعة | ||||
|---|---|---|---|---|---|---|
| يكتب | القيمة الدنيا | القيمة القصوى | يكتب | القيمة الدنيا | القيمة القصوى | |
| العرض الدقيق | intn_t |
INTn_MIN |
INTn_MAX
|
uintn_t |
0 | UINTn_MAX
|
| أقل عرض | int_leastn_t |
INT_LEASTn_MIN |
INT_LEASTn_MAX
|
uint_leastn_t |
0 | UINT_LEASTn_MAX
|
| الأسرع | int_fastn_t |
INT_FASTn_MIN |
INT_FASTn_MAX
|
uint_fastn_t |
0 | UINT_FASTn_MAX
|
| مؤشر | intptr_t |
INTPTR_MIN |
INTPTR_MAX
|
uintptr_t |
0 | UINTPTR_MAX
|
| الحد الأقصى للعرض | intmax_t |
INTMAX_MIN |
INTMAX_MAX
|
uintmax_t |
0 | UINTMAX_MAX
|
مواصفات تنسيق Printf وscanf
يوفر الرأس <inttypes.h>( cinttypesفي C++) ميزات تعزز وظائف الأنواع المحددة في <stdint.h>الرأس. فهو يحدد وحدات الماكرو لمواصفات تنسيق سلسلة printf وتنسيق سلسلة scanf المقابلة للأنواع المحددة في <stdint.h>والعديد من الوظائف للعمل مع الأنواع intmax_tو uintmax_t. تمت إضافة هذا الرأس في C99 .
تنسيق سلسلة Printf
تكون وحدات الماكرو بالتنسيق . هنا، يحدد {fmt} تنسيق الإخراج ويكون أحد التنسيقات التالية (عشري)، (سداسي عشري)، (ثماني)، (غير موقّع) و (عدد صحيح). يحدد {type} نوع الوسيطة ويكون أحد التنسيقات التالية , , , , , حيث يتوافق مع عدد البتات في الوسيطة.
PRI{fmt}{type}dxouinFASTnLEASTnPTRMAXn
تنسيق سلسلة المسح الضوئي
تكون وحدات الماكرو بالتنسيق . هنا، يحدد {fmt} تنسيق الإخراج ويكون أحد التنسيقات التالية (عشري)، (سداسي عشري)، (ثماني)، (غير موقّع) و (عدد صحيح). يحدد {type} نوع الوسيطة ويكون أحد التنسيقات التالية , , , , , حيث يتوافق مع عدد البتات في الوسيطة.
SCN{fmt}{type}dxouinFASTnLEASTnPTRMAXn
الوظائف
هذا القسم يحتاج إلى التوسعة ، يمكنك المساعدة بإضافة المزيد إليه. ( أكتوبر 2011 ) |
أنواع إضافية للفاصلة العائمة
على نحو مماثل لأنواع الأعداد الصحيحة ذات العرض الثابت، تحدد ISO/IEC TS 18661 أنواع الفاصلة العائمة لتبادل IEEE 754 والتنسيقات الممتدة في النظام الثنائي والعشري:
_FloatNلتنسيقات التبادل الثنائي؛_DecimalNلتنسيقات التبادل العشرية؛_FloatNxللتنسيقات الثنائية الممتدة؛_DecimalNxللتنسيقات العشرية الممتدة.
الهياكل
تجمع الهياكل تخزين عناصر بيانات متعددة، من أنواع بيانات مختلفة محتملة، في كتلة ذاكرة واحدة يتم الرجوع إليها بواسطة متغير واحد. يوضح المثال التالي نوع البيانات struct birthdayالذي يحتوي على اسم وعيد ميلاد شخص ما. يتبع تعريف الهيكل إعلانًا للمتغير Johnالذي يخصص مساحة التخزين المطلوبة.
بنية عيد الميلاد { char name [ 20 ]; int day ; int month ; int year ; };
هيكل عيد ميلاد جون ؛
إن تخطيط الذاكرة للهيكل هو مشكلة تتعلق بتنفيذ اللغة لكل منصة، مع بعض القيود. يجب أن يكون عنوان الذاكرة للعضو الأول هو نفسه عنوان الهيكل نفسه. يمكن تهيئة الهياكل أو تعيينها باستخدام أحرف مركبة. قد تقوم الدالة بإرجاع هيكل بشكل مباشر، على الرغم من أن هذا غالبًا ما لا يكون فعالاً في وقت التشغيل. منذ C99 ، قد ينتهي الهيكل أيضًا بعنصر مصفوفة مرن .
يتم استخدام هيكل يحتوي على مؤشر إلى هيكل من نوعه الخاص عادةً لبناء هياكل بيانات مرتبطة :
بنية العقدة { int val ؛ بنية العقدة * التالية ؛ };
المصفوفات
لكل نوع T، باستثناء النوعين void وfunction، توجد أنواع "مجموعة من Nالعناصر من النوع T" . المجموعة عبارة عن مجموعة من القيم، كلها من نفس النوع، مخزنة بشكل متجاور في الذاكرة. Nيتم فهرسة مجموعة من الحجم بالأعداد الصحيحة من 0up to و including N−1. فيما يلي مثال موجز:
int cat [ 10 ]; // مجموعة من 10 عناصر، كل منها من نوع int
يمكن تهيئة المصفوفات باستخدام مُهيئ مركب، ولكن لا يمكن تعيينه. يتم تمرير المصفوفات إلى الدوال عن طريق تمرير مؤشر إلى العنصر الأول. يتم تعريف المصفوفات متعددة الأبعاد على أنها "مصفوفة من مصفوفة ..." ، ويجب أن يكون لكل منها، باستثناء البعد الخارجي، حجم ثابت وقت التجميع:
int a [ 10 ][ 8 ]; // مجموعة من 10 عناصر، كل منها من نوع 'مجموعة من 8 عناصر int'
المؤشرات
كل نوع بيانات Tله مؤشر نوع مطابق لهT . المؤشر هو نوع بيانات يحتوي على عنوان موقع تخزين لمتغير من نوع معين. يتم إعلانه باستخدام *معلن النوع asterisk ( ) بعد نوع التخزين الأساسي وقبل اسم المتغير. المسافة البيضاء قبل أو بعد علامة النجمة اختيارية.
char * مربع ؛ طويل * دائرة ؛ int * بيضاوي ؛
يمكن أيضًا إعلان المؤشرات لأنواع بيانات المؤشرات، وبالتالي إنشاء مؤشرات غير مباشرة متعددة، مثل char ** و int *** ، بما في ذلك المؤشرات إلى أنواع المصفوفات. الأخيرة أقل شيوعًا من مصفوفة المؤشرات، وقد يكون تركيبها النحوي مربكًا:
char * pc [ 10 ]; // مجموعة من 10 عناصر من 'مؤشر إلى char' char ( * pa ) [ 10 ]; // مؤشر إلى مجموعة من 10 عناصر من char
يتطلب العنصر pcعشرة كتل من الذاكرة بحجم المؤشر إلىchar (عادة 40 أو 80 بايت على المنصات الشائعة)، ولكن العنصر paهو مؤشر واحد فقط (حجم 4 أو 8 بايت)، والبيانات التي يشير إليها هي مجموعة من عشرة بايتات ( ).
sizeof *pa == 10
النقابات
نوع الاتحاد هو بنية خاصة تسمح بالوصول إلى نفس كتلة الذاكرة باستخدام اختيار من أوصاف الأنواع المختلفة. على سبيل المثال، يمكن إعلان اتحاد أنواع البيانات للسماح بقراءة نفس البيانات إما كعدد صحيح أو عدد عشري أو أي نوع آخر معلن من قبل المستخدم:
الاتحاد { int i ؛ float f ؛ الهيكل { غير موقّع int u ؛ double d ؛ } s ؛ } u ؛
الحجم الإجمالي لـ uهو حجم u.s- والذي يكون مجموع أحجام u.s.uو u.s.d- حيث sيكون أكبر من كل iمن و f. عند تعيين شيء ما إلى ، يمكن الاحتفاظ u.iببعض أجزاء من إذا كان أصغر من .
u.fu.iu.f
إن القراءة من عضو النقابة ليست مثل الصب لأن قيمة العضو لا يتم تحويلها، بل مجرد قراءة.
مؤشرات الوظيفة
تسمح مؤشرات الوظيفة بالإشارة إلى الوظائف بتوقيع معين. على سبيل المثال، لتخزين عنوان الوظيفة القياسية absفي المتغير my_int_f:
int ( * my_int_f )( int ) = & abs ; // يمكن حذف عامل &، ولكن يوضح أن "عنوان" abs يُستخدم هنا
يتم استدعاء مؤشرات الوظيفة بالاسم تمامًا مثل استدعاءات الوظيفة العادية. مؤشرات الوظيفة منفصلة عن المؤشرات ومؤشرات الفارغة .
مؤهلات النوع
يمكن وصف الأنواع المذكورة أعلاه بشكل أكبر من خلال مؤهلات النوع ، مما ينتج عنه نوع مؤهل . اعتبارًا من عام 2014 [تحديث]و C11 ، يوجد أربعة مؤهلات نوع في لغة C القياسية: const( C89 ) و volatile( C89 ) و restrict( C99 ) و _Atomic( C11 ) - يحتوي الأخير على اسم خاص لتجنب التعارض مع أسماء المستخدمين، [14]atomic ولكن يمكن استخدام الاسم الأكثر شيوعًا إذا <stdatomic.h>تم تضمين الرأس. من بين هذه، constهو الأكثر شهرة والأكثر استخدامًا، والذي يظهر في المكتبة القياسية ويصادف في أي استخدام مهم للغة C، والذي يجب أن يلبي صحة الثوابت . تُستخدم المؤهلات الأخرى للبرمجة منخفضة المستوى، وعلى الرغم من استخدامها على نطاق واسع هناك، إلا أن المبرمجين النموذجيين نادرًا ما يستخدمونها. [ بحاجة لمصدر ]
انظر أيضا
مراجع
- ^ Barr, Michael (2 ديسمبر 2007). "أعداد صحيحة محمولة ذات عرض ثابت في لغة C" . تم الاسترجاع في 18 يناير 2016 .
- ^ حسب مواصفات ISO/IEC 9899:1999، TC3 (PDF) . ص. 255، الفقرة 7.18 أنواع الأعداد الصحيحة <stdint.h> .
- ^ abcdefghij مواصفات ISO/IEC 9899:1999، TC3 (PDF) . ص. 22، § 5.2.4.2.1 أحجام أنواع الأعداد الصحيحة <limits.h> .
- ^ الأساس المنطقي للمعيار الدولي للغات البرمجة - C المراجعة 5.10 (PDF) . ص 25، § 5.2.4.2.1 أحجام أنواع الأعداد الصحيحة <limits.h> .
- ^ مسودة مواصفات ISO/IEC 9899:2023 (PDF) . ص. 41، § 6.2.6 تمثيلات الأنواع .
- ^ "حدود الأعداد الصحيحة في C وC++". 21 يوليو 2023.
- ^ ab ISO/IEC 9899:1999 specifications, TC3 (PDF) . p. 37, § 6.2.6.1 تمثيلات الأنواع – عام .
- ^ abcdef ISO/IEC 9899:1999 specifications, TC3 (PDF) . ص 56، § 6.4.4.1 ثوابت الأعداد الصحيحة .
- ^ "نماذج البرمجة 64 بت: لماذا LP64؟". المجموعة المفتوحة . تم الاسترجاع في 9 نوفمبر 2011 .
- ^ "عرض النوع (مكتبة جنو سي)". www.gnu.org . تم الاسترجاع في 30 يوليو 2022 .
- ^ "<limits.h>". pubs.opengroup.org . تم الاسترجاع في 30 يوليو 2022 .
- ^ مواصفات ISO/IEC 9899:1999، TC3 (PDF) . ص. 67، الفقرة 6.5 التعبيرات .
- ^ مسودة مواصفات ISO/IEC 9899:2023 (PDF) . ص. 37، § 6.2.5 الأنواع .
- ^ C11: المعيار C الجديد، توماس بلام
