أنواع البيانات C

في لغة البرمجة 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 ]
  • قصير
  • قصير int
  • توقيع قصير
  • توقيع قصير int
نوع عدد صحيح قصير موقّع. قادر على احتواء [ على الأقل-32767 ،+32 767 ] النطاق. [3] [أ] 16 %hiأو%hd [ الحد الأدنى للسرعة ، الحد الأقصى للسرعة ]
  • قصيرة غير موقعة
  • int قصير غير موقّع
نوع عدد صحيح قصير غير موقّع. يحتوي على الأقل على [0 ,65 535 ] المدى. [3] 16 %hu [0, USHRT_MAX ]
  • دولي
  • وقعت
  • توقيع int
نوع عدد صحيح أساسي موقّع. قادر على احتواء [ على الأقل-32767 ،+32 767 ] النطاق. [3] [أ] 16 %iأو%d [ INT_MIN , INT_MAX ] لا شيء [8]
  • غير موقع
  • int غير موقّع
نوع عدد صحيح غير موقّع أساسي. يحتوي على الأقل على [0 ,65 535 ] المدى. [3] 16 %u [0, UINT_MAX ] u أو U [8]
  • طويل
  • طويل int
  • توقيع طويل
  • توقيع طويل int
نوع عدد صحيح طويل موقّع. قادر على احتواء [ على الأقل-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]
  • طويل طويل
  • طويل طويل int
  • وقعت لفترة طويلة
  • وقعت طويلة طويلة int
نوع عدد صحيح طويل ومميز. قادر على احتواء [ على الأقل−9 223 372 036 854 775 807 ،+9 223 372 036 854 775 807 ] النطاق. [3] [أ] تم تحديده منذ إصدار C99 من المعيار. 64 %lliأو%lld [ الحد الأدنى للطول ، الحد الأقصى للطول ] ll أو LL [8]
  • غير موقّع طويل طويل
  • غير موقّع طويل طويل int
نوع عدد صحيح طويل غير موقّع. يحتوي على الأقل على [0 ,18 446 744 073 709 551 615 ] النطاق. [3] تم تحديده منذ إصدار C99 من المعيار. 64 %llu [0, أولونج_ماكس ] كل من u أو U و ll أو LL [8]
يطفو نوع الفاصلة العائمة الحقيقي، ويشار إليه عادةً باسم نوع الفاصلة العائمة أحادي الدقة. الخصائص الفعلية غير محددة (باستثناء الحدود الدنيا)؛ ومع ذلك، في معظم الأنظمة، هذا هو تنسيق الفاصلة العائمة الثنائي أحادي الدقة IEEE 754 (32 بت). هذا التنسيق مطلوب بموجب الملحق F الاختياري "حسابات الفاصلة العائمة IEC 60559". التحويل من النص: [د]
  • %f %F
  • %g %G
  • %e %E
  • %a %A
ف أو ف
مزدوج نوع الفاصلة العائمة الحقيقي، ويشار إليه عادةً باسم نوع الفاصلة العائمة ذي الدقة المزدوجة. الخصائص الفعلية غير محددة (باستثناء الحدود الدنيا)؛ ومع ذلك، في معظم الأنظمة، هذا هو تنسيق الفاصلة العائمة الثنائي ذي الدقة المزدوجة IEEE 754 (64 بت). هذا التنسيق مطلوب بموجب الملحق F الاختياري "حسابات الفاصلة العائمة IEC 60559".
  • %lf %lF
  • %lg %lG
  • %le %lE
  • %la %lA[هـ]
لا أحد
طويل مزدوج نوع الفاصلة العائمة الحقيقي، عادة ما يتم تعيينه إلى تنسيق رقم الفاصلة العائمة بدقة ممتدة . الخصائص الفعلية غير محددة. يمكن أن يكون إما تنسيق الفاصلة العائمة بدقة ممتدة x86 (80 بت، ولكن عادةً 96 بت أو 128 بت في الذاكرة مع بايتات الحشو )، أو تنسيق الفاصلة العائمة " double-double " غير التابع لـ IEEE (128 بت)، أو تنسيق الفاصلة العائمة بدقة رباعية IEEE 754 (128 بت)، أو نفس تنسيق double. راجع المقال حول long double للحصول على التفاصيل. %Lf %LF
%Lg %LG
%Le %LE
%La %LA[هـ]
ل أو ل
  1. ^ abcde تأتي النطاقات الدنيا [−(2 n −1 −1)، 2 n −1 −1] (على سبيل المثال [−127,127]) من التمثيلات الصحيحة المتنوعة المسموح بها بالمعيار ( مكمل الواحدات ، ومقدار الإشارة ، ومكمل الاثنين ). [4] ومع ذلك، تستخدم معظم المنصات مكمل الاثنين، مما يعني نطاقًا من النموذج [−2 m −1 ، 2 m −1 −1] مع mn لهذه التنفيذات، على سبيل المثال [−128,127] ( SCHAR_MIN == −128و ) لحرف موقّعSCHAR_MAX == 127 مكون من 8 بتات . منذ C23، فإن التمثيل الوحيد المسموح به هو مكمل الاثنين، وبالتالي تتراوح القيم من [−2 n −1 ، 2 n −1 −1] على الأقل . [5]
  2. ^ أو %hhiللإخراج الرقمي
  3. ^ أو %hhuللإخراج الرقمي
  4. ^ توجد سلاسل التنسيق هذه أيضًا لتنسيق النص، ولكنها تعمل على شكل مزدوج.
  5. ^ 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 long
  • SCHAR_MAX, SHRT_MAX, INT_MAX, LONG_MAX, LLONG_MAX(C99) - الحد الأقصى للقيمة الممكنة لأنواع الأعداد الصحيحة الموقعة: signed char، signed short، signed int، signed long، signed long long
  • UCHAR_MAX, USHRT_MAX, UINT_MAX, ULONG_MAX, ULLONG_MAX(C99) - أقصى قيمة ممكنة لأنواع الأعداد الصحيحة غير الموقعة: unsigned char، unsigned short، unsigned int، unsigned long، unsigned long long
  • CHAR_MIN- الحد الأدنى لقيمة char الممكنة
  • CHAR_MAX- أقصى قيمة ممكنة للحرف
  • MB_LEN_MAX- الحد الأقصى لعدد البايتات في حرف متعدد البايتات
  • BOOL_WIDTH(C23) - عرض البت _Bool، دائمًا 1
  • CHAR_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

الوظائف

أنواع إضافية للفاصلة العائمة

على نحو مماثل لأنواع الأعداد الصحيحة ذات العرض الثابت، تحدد 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، والذي يجب أن يلبي صحة الثوابت . تُستخدم المؤهلات الأخرى للبرمجة منخفضة المستوى، وعلى الرغم من استخدامها على نطاق واسع هناك، إلا أن المبرمجين النموذجيين نادرًا ما يستخدمونها. [ بحاجة لمصدر ]

انظر أيضا

مراجع

  1. ^ Barr, Michael (2 ديسمبر 2007). "أعداد صحيحة محمولة ذات عرض ثابت في لغة C" . تم الاسترجاع في 18 يناير 2016 .
  2. ^ حسب مواصفات ISO/IEC 9899:1999، TC3 (PDF) . ص. 255، الفقرة 7.18 أنواع الأعداد الصحيحة <stdint.h> .
  3. ^ abcdefghij مواصفات ISO/IEC 9899:1999، TC3 (PDF) . ص. 22، § 5.2.4.2.1 أحجام أنواع الأعداد الصحيحة <limits.h> .
  4. ^ الأساس المنطقي للمعيار الدولي للغات البرمجة - C المراجعة 5.10 (PDF) . ص 25، § 5.2.4.2.1 أحجام أنواع الأعداد الصحيحة <limits.h> .
  5. ^ مسودة مواصفات ISO/IEC 9899:2023 (PDF) . ص. 41، § 6.2.6 تمثيلات الأنواع .
  6. ^ "حدود الأعداد الصحيحة في C وC++". 21 يوليو 2023.
  7. ^ ab ISO/IEC 9899:1999 specifications, TC3 (PDF) . p. 37, § 6.2.6.1 تمثيلات الأنواع – عام .
  8. ^ abcdef ISO/IEC 9899:1999 specifications, TC3 (PDF) . ص 56، § 6.4.4.1 ثوابت الأعداد الصحيحة .
  9. ^ "نماذج البرمجة 64 بت: لماذا LP64؟". المجموعة المفتوحة . تم الاسترجاع في 9 نوفمبر 2011 .
  10. ^ "عرض النوع (مكتبة جنو سي)". www.gnu.org . تم الاسترجاع في 30 يوليو 2022 .
  11. ^ "<limits.h>". pubs.opengroup.org . تم الاسترجاع في 30 يوليو 2022 .
  12. ^ مواصفات ISO/IEC 9899:1999، TC3 (PDF) . ص. 67، الفقرة 6.5 التعبيرات .
  13. ^ مسودة مواصفات ISO/IEC 9899:2023 (PDF) . ص. 37، § 6.2.5 الأنواع .
  14. ^ C11: المعيار C الجديد، توماس بلام
تم الاسترجاع من "https://en.wikipedia.org/w/index.php?title=أنواع_بيانات_C&oldid=1246026447"
Original text
Rate this translation
Your feedback will be used to help improve Google Translate