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

في لغة البرمجة C ، تُشكّل أنواع البيانات دلالات وخصائص تخزين عناصر البيانات. ويتم التعبير عنها في بنية اللغة على شكل تعريفات لمواقع الذاكرة أو المتغيرات . كما تُحدد أنواع البيانات أنواع العمليات أو طرق معالجة عناصر البيانات.

توفر لغة C أنواعًا حسابية أساسية، مثل أنواع الأعداد الصحيحة والأعداد الحقيقية ، بالإضافة إلى صيغة لبناء المصفوفات والأنواع المركبة. تحتوي مكتبة C القياسية على تعريفات إضافية لأنواع الدعم، والتي تتميز بخصائص إضافية، مثل توفير مساحة تخزين بحجم دقيق، بغض النظر عن تطبيق اللغة على منصات الأجهزة المحددة. [ 1 ] [ 2 ]

الأنواع الأساسية

الأنواع الرئيسية

توفر لغة C أربعة مُحدِّدات أساسية لأنواع البيانات الحسابية char، intوهي: `int` floatو`int` و`int` double(بالإضافة إلى النوع المنطقي `Boolean` bool)، بالإضافة إلى المُعدِّلات signed`int` unsignedو` shortint` و`int` و`int` long. يوضح الجدول التالي التركيبات المسموح بها لتحديد مجموعة كبيرة من التصريحات الخاصة بحجم التخزين.

يكتبتوضيحالحجم (بت) [ أ ]مُحدد التنسيقيتراوحلاحقة للثوابت العشرية
boolنوع منطقي، تمت إضافته في C23 . (تمت إضافته سابقًا _Boolفي C99 ، [ 3 ] ولكن لم يتم تحديد حجمه ونطاقه.)1 (بالضبط)%d[ خطأ ، صحيح ]غير متوفر
charأصغر وحدة قابلة للعنونة في الجهاز يمكنها احتواء مجموعة الأحرف الأساسية. وهي من نوع عدد صحيح . يمكن أن يكون النوع الفعلي إما موقّعًا أو غير موقّع. وهي تحتوي على CHAR_BITبتات. [ 4 ]≥8%c[ CHAR_MIN , CHAR_MAX ]غير متوفر
signed charبنفس حجم char، ولكن مضمونة التوقيع. قادرة على احتواء النطاق [ −127، +127 ] على الأقل . [ 4 ] [ ب ]≥8%c[ ج ][ SCHAR_MIN , SCHAR_MAX ] [ 7 ]غير متوفر
unsigned charبحجم مماثل char، ولكن مضمون أنه غير مُوقّع. يحتوي على الأقل على النطاق [ 0، 255 ] . [ 8 ]≥8%c[ د ][ 0, UCHAR_MAX ]غير متوفر
  • short
  • short int
  • signed short
  • signed short int
نوع عدد صحيح قصير مُوقّع. قادر على احتواء [ على الأقل-32767 ،[32767+ ] النطاق . [ 4 ] [ ب ]≥16%hiأو%hd[ SHRT_MIN , SHRT_MAX ]غير متوفر
  • unsigned short
  • unsigned short int
نوع عدد صحيح قصير غير مُوقَّع. يحتوي على الأقل على [٠ ،65535 ] نطاق . [ 4 ]≥16%hu[ 0, USHRT_MAX ]غير متوفر
  • int
  • signed
  • signed int
نوع بيانات عدد صحيح مُوقّع أساسي. قادر على احتواء [ على الأقل-32767 ،[32767+ ] النطاق . [ 4 ] [ ب ]≥16%iأو%d[ INT_MIN , INT_MAX ]لا شيء [ 9 ]
  • unsigned
  • unsigned int
نوع البيانات الأساسي غير المُوقَّع. يحتوي على الأقل على [٠ ،65535 ] نطاق . [ 4 ]≥16%u[ 0, UINT_MAX ]u أو U [ 9 ]
  • long
  • long int
  • signed long
  • signed long int
نوع عدد صحيح طويل مُوقّع. قادر على احتواء [-2 147 483 647 ،[+2 147 483 647 ] النطاق. [ 4 ] [ ب ]≥32%liأو%ld[ LONG_MIN , LONG_MAX ]ل أو ل [ 9 ]
  • unsigned long
  • unsigned long int
نوع عدد صحيح طويل غير مُوقَّع. قادر على احتواء ما لا يقل عن [٠ ،4 294 967 295 ] النطاق. [ 4 ]≥32%lu[ 0, ULONG_MAX ]كل من u أو U و l أو L [ 9 ]
  • long long
  • long long int
  • signed long long
  • signed long long int
نوع بيانات عدد صحيح طويل جدًا ومُوقّع. قادر على احتواء ما لا يقل عن [-9 223 372 036 854 775 807 ،[+9 223 372 036 854 775 807 ] النطاق. [ 4 ] [ ب ] محدد منذ إصدار C99 من المعيار.≥64%lliأو%lld[ LLONG_MIN , LLONG_MAX ]ll أو LL [ 9 ]
  • unsigned long long
  • unsigned long long int
نوع عدد صحيح طويل غير مُوقَّع. يحتوي على الأقل على [٠ ،18 446 744 073 709 551 615 ] النطاق. [ 4 ] محدد منذ إصدار C99 من المعيار.≥64%llu[ 0, ULLONG_MAX ]كل من u أو U و ll أو LL [ 9 ]
floatنوع بيانات الفاصلة العائمة الحقيقية، ويُشار إليه عادةً بنوع بيانات الفاصلة العائمة أحادية الدقة. لم تُحدد خصائصه الفعلية (باستثناء الحدود الدنيا)؛ ومع ذلك، في معظم الأنظمة، يكون هذا هو تنسيق الفاصلة العائمة الثنائية أحادية الدقة IEEE 754 (32 بت). هذا التنسيق مطلوب بموجب الملحق الاختياري F "الحسابات ذات الفاصلة العائمة IEC 60559".التحويل من نص: [ هـ ]
  • %f%F
  • %g%G
  • %e%E
  • %a%A
f لـ F
doubleنوع بيانات الفاصلة العائمة الحقيقية، ويُشار إليه عادةً بنوع بيانات الفاصلة العائمة مزدوجة الدقة. لم تُحدد خصائصه الفعلية (باستثناء الحدود الدنيا)؛ ومع ذلك، في معظم الأنظمة، يكون هذا هو تنسيق الفاصلة العائمة الثنائية مزدوجة الدقة IEEE 754 (64 بت). هذا التنسيق مطلوب بموجب الملحق الاختياري F "الحسابات ذات الفاصلة العائمة IEC 60559".
  • %lf%lF
  • %lg%lG
  • %le%lE
  • %la%lA[ f ]
لا أحد
long doubleنوع بيانات الفاصلة العائمة الحقيقية، يُطابق عادةً تنسيق أرقام الفاصلة العائمة ذات الدقة الموسعة . لم تُحدد خصائصه الفعلية. يمكن أن يكون إما تنسيق الفاصلة العائمة ذي الدقة الموسعة x86 (80 بت، ولكن عادةً 96 بت أو 128 بت في الذاكرة مع بايتات الحشو )، أو تنسيق " double-double " غير المتوافق مع معيار IEEE (128 بت)، أو تنسيق الفاصلة العائمة ذي الدقة الرباعية IEEE 754 (128 بت)، أو نفس تنسيق double. راجع مقال long double لمزيد من التفاصيل.%Lf%LF%Lg%LG%Le%LE%La%LA[ f ]ل أو ل
  1. المصطلح القياسي لحجم نوع البيانات العددية بالبتات هو العرض . ولا يشمل العرض بتات الحشو.
  2. 1 2 3 4 5 تأتي النطاقات الدنيا [ −( 2n 1−1), 2n 1−1 ] ( مثل [−127,127]) من تمثيلات الأعداد الصحيحة المختلفة المسموح بها في المعيار ( المتمم الأحادي ، الإشارة والمقدار ، المتمم الثنائي ). [ 5 ] مع ذلك، تستخدم معظم المنصات المتمم الثنائي، مما يعني نطاقًا على شكل [ −2m 1 , 2m 1−1 ] حيث mn لهذه التطبيقات، مثل [−128,127] (و ) لحرف مُوَقَّع من 8 بت. منذ C23، أصبح التمثيل الوحيد المسموح به هو المتمم الثنائي، وبالتالي تتراوح القيم على الأقل من [ −2n 1 , 2n 1−1 ] . [ 6 ]SCHAR_MIN == −128SCHAR_MAX == 127
  3. أو%hhiللحصول على مخرجات رقمية
  4. أو%hhuللحصول على مخرجات رقمية
  5. توجد سلاسل التنسيق هذه أيضًا لتنسيق النص، ولكنها تعمل على عدد عشري مزدوج.
  6. 1 2 يختلف استخدام الأحرف الكبيرة عن الأحرف الصغيرة في المخرجات. تُنتج مُحدِّدات الأحرف الكبيرة القيم بأحرف كبيرة، بينما تُنتج مُحدِّدات الأحرف الصغيرة قيمًا بأحرف صغيرة (تُنتج %A و%E و%F و%G قيمًا مثل INF وNAN وE (الأس) بأحرف كبيرة).

يختلف الحجم الفعلي لأنواع البيانات الصحيحة باختلاف التطبيق. لا يتطلب المعيار سوى تحديد علاقات الحجم بين أنواع البيانات والحد الأدنى لأحجام كل نوع بيانات.

متطلبات العلاقة هي long longألا يكون حجم أصغر من long، والذي بدوره ليس أصغر من int، والذي بدوره ليس أصغر من short. وبما أن charحجم هو دائمًا الحد الأدنى لنوع البيانات المدعوم، فلا يمكن أن تكون أنواع البيانات الأخرى (باستثناء حقول البت ) أصغر منه.

الحد الأدنى لحجم هو 8 بت، والحد charالأدنى لحجم هو 16 بت، أما بالنسبة لـ فهو 32 بت ويجب أن يحتوي على 64 بت على الأقل.shortintlonglong long

ينبغي أن يكون نوع البيانات intهو نوع الأعداد الصحيحة الذي يتعامل معه المعالج المستهدف بكفاءة عالية. وهذا يتيح مرونة كبيرة؛ فعلى سبيل المثال، يمكن أن تكون جميع الأنواع 64 بت. ومع ذلك، توجد عدة مخططات مختلفة لعرض الأعداد الصحيحة (نماذج البيانات) شائعة الاستخدام. ولأن نموذج البيانات يحدد كيفية تواصل البرامج المختلفة، يُستخدم نموذج بيانات موحد ضمن واجهة تطبيق نظام التشغيل. [ 10 ]

في الواقع، charيكون حجم النوع عادةً 8 ​​بتات، بينما shortيكون حجم النوع الآخر 16 بتًا (كما هو الحال مع نظائره غير الموقعة). وينطبق هذا على منصات متنوعة مثل نظام التشغيل يونكس SunOS  4 من تسعينيات القرن الماضي، ونظام التشغيل مايكروسوفت MS-DOS ، ونظام لينكس الحديث ، ومعالج Microchip MCC18 لوحدات التحكم الدقيقة PIC المدمجة ذات 8 بتات . يتطلب معيار POSIXchar أن يكون حجم النوع 8 بتات بالضبط. [ 11 ] [ 12 ]

تُتيح قواعد مختلفة في معيار لغة C unsigned charللنوع الأساسي المستخدم للمصفوفات تخزين كائنات عشوائية غير مُعرَّفة على حقول بتية: افتقاره إلى بتات الحشو وتمثيلات الفخ، وتعريف تمثيل الكائن ، [ 8 ] وإمكانية التداخل. [ 13 ]

يختلف الحجم الفعلي وسلوك أنواع الأعداد العشرية باختلاف التطبيق. الشرط الوحيد هو long doubleألا يكون أصغر من double، والذي بدوره ليس أصغر من . عادةً ما تُستخدم تنسيقات الأعداد العشرية الثنائية IEEE 754float ذات 32 بت و64 بت على التوالي لـ و .floatdouble

يتضمن معيار C99 أنواعًا جديدة من الأعداد العشرية الحقيقية ، float_tوهي double_tمُعرَّفة في [مرجع <math.h>]. تتوافق هذه الأنواع مع الأنواع المستخدمة للنتائج الوسيطة لتعبيرات الأعداد العشرية عندما FLT_EVAL_METHODتكون قيمة [قيمة] تساوي 0 أو 1 أو 2. قد تكون هذه الأنواع أوسع من [مرجع] long double.

أضافت C99 أيضًا أنواعًا مركبةfloat _Complex : ، double _Complex، long double _Complex. وأضافت C11 أنواعًا تخيلية (وُصفت في ملحق معلوماتي من C99): float _Imaginary، double _Imaginary، long double _Imaginary. يسمح تضمين الترويسة <complex.h>بالوصول إلى جميع هذه الأنواع باستخدام complexو imaginaryعلى التوالي.

نوع منطقي

أضافت C99 نوع بيانات منطقيًا_Bool . بالإضافة إلى ذلك، <stdbool.h>يُعرّف ملف الرأس `<T>` boolكاسم بديل مناسب لهذا النوع، كما يوفر وحدات ماكرو لـ `<T>` trueو ` <T> false`. _Boolتعمل `<T>` بشكل مشابه لنوع البيانات العددية العادية، باستثناء واحد: أي تحويل إلى `<T> _Bool` يُعطي 0 (خطأ) إذا كانت القيمة تساوي 0؛ وإلا، فإنه يُعطي 1 (صواب). هذا السلوك موجود لتجنب تجاوزات الأعداد الصحيحة في تحويلات التضييق الضمنية. على سبيل المثال، في الكود التالي:

unsigned char b = 256 ;إذا ( ب ) { // قم بشيء ما }

تُقيّم المتغيرة bإلى خطأ إذا unsigned charكان حجمها 8 بتات. والسبب هو أن القيمة 256 لا تتناسب مع نوع البيانات، مما يؤدي إلى استخدام البتات الثمانية الأقل أهمية، وبالتالي تكون القيمة صفرًا. مع ذلك، يؤدي تغيير نوع البيانات إلى عمل الكود السابق بشكل طبيعي.

_Bool b = 256 ;إذا ( ب ) { // قم بشيء ما }

يضمن هذا النوع _Boolأيضًا أن تكون القيم الحقيقية متساوية دائمًا عند مقارنتها ببعضها البعض:

_Bool a = 1 ; _Bool b = 2 ;إذا كان ( أ == ب ) { // سيتم تنفيذ هذا الكود }

في C23 ، أصبحت bool(وقيمها trueو false) وظيفة أساسية للغة (مما جعل محتويات [ 14 ] [ 15 ]<stdbool.h> قديمة )، مما يسمح بأمثلة التعليمات البرمجية التالية:

bool b = true ;إذا ( ب ) { // سيتم تنفيذ هذا الكود }

أنواع الأعداد الصحيحة الدقيقة على مستوى البت

منذ إصدار C23 ، تسمح اللغة للمبرمج بتعريف أعداد صحيحة بعرض عدد بتات عشوائي. تُحدد هذه الأنواع كـ `N` ، حيث N ثابت عددي يُشير إلى عدد البتات، بما في ذلك بت الإشارة للأنواع الموقعة، مُمثلة بنظام المتمم الثنائي. تُحدد القيمة القصوى لـ N بواسطة `N` ، وهي على الأقل `N` . بالتالي، يأخذ النوع ` N` (أو `N` ) قيمًا من -2 إلى 1، بينما يأخذ النوع `N` قيمًا من 0 إلى 3. يوجد أيضًا النوع `N` ، الذي يأخذ إما 0 أو 1، وليس له نوع موقع مكافئ. [ 16 ] يقترح اقتراح لإصدار C2Y رفع هذا القيد والسماح بـ `N` ، الذي يأخذ حينها القيمتين 0 و-1، مما يُلغي الحالة الخاصة لـ ` N`. [ 17 ]_BitInt(N)BITINT_MAXWIDTHULLONG_WIDTH_BitInt(2)signed_BitInt(2)unsigned_BitInt(2)unsigned_BitInt(1)signed_BitInt(1)unsigned_BitInt(1)

أنواع الاختلافات في الحجم والمؤشر

تتضمن مواصفات لغة C تعريف النوعين `typedef s` و` typedef s` لتمثيل الكميات المتعلقة بالذاكرة. يُحدد حجمهما وفقًا لقدرات المعالج المستهدف الحسابية، وليس وفقًا لقدرات الذاكرة، مثل مساحة العناوين المتاحة. يُعرّف كلا النوعين في ملف الرأس.size_tptrdiff_t<stddef.h>

size_tهو نوع عدد صحيح غير مُوقَّع يُستخدم لتمثيل حجم أي كائن (بما في ذلك المصفوفات) في التطبيق المُحدد. يُنتج عامل sizeof قيمة من هذا النوع . يتم تحديد الحد الأقصى لحجمه عبر ثابت ماكرو مُعرَّف في ملف الرأس. يُضمن أن يكون عرضه 16 بت على الأقل. بالإضافة إلى ذلك، يتضمن معيار POSIX نوع عدد صحيح مُوقَّع له نفس عرض النوع .size_tsize_tSIZE_MAX<stdint.h>size_tssize_tsize_t

ptrdiff_tهو نوع عدد صحيح مُوَقَّع يُستخدم لتمثيل الفرق بين المؤشرات. وهو مضمون الصلاحية فقط مع المؤشرات من نفس النوع؛ أما طرح المؤشرات التي تتكون من أنواع مختلفة فهو أمرٌ تحدده آلية التنفيذ.

واجهة لخصائص الأنواع الأساسية

تُوفّر معلومات حول الخصائص الفعلية، مثل الحجم، لأنواع العمليات الحسابية الأساسية، عبر ثوابت ماكرو في ملفي رأس: <limits.h>يُعرّف ملف الرأس الأول ماكرو لأنواع الأعداد الصحيحة، بينما <float.h>يُعرّف ملف الرأس الثاني ماكرو لأنواع الأعداد العشرية. وتعتمد القيم الفعلية على التنفيذ.

خصائص أنواع الأعداد الصحيحة

  • CHAR_BIT– حجم نوع الأحرف بالبتات، ويشار إليه عادةً بحجم البايت ( 8 بتات على الأقل)
  • SCHAR_MIN( SHRT_MINC99 ) – الحد INT_MINالأدنى الممكن لقيمة أنواع الأعداد الصحيحة الموقعة: signed char، signed short، signed int، signed long، signed long longLONG_MINLLONG_MIN
  • SCHAR_MAX( C99 SHRT_MAX) – القيمة القصوى الممكنة لأنواع الأعداد الصحيحة الموقعة: signed char، signed short، signed int، signed long، signed INT_MAXlong longLONG_MAXLLONG_MAX
  • UCHAR_MAX( C99) – القيمة القصوى الممكنة لأنواع الأعداد الصحيحة غير الموقعة: unsigned char، unsigned short، unsigned int، unsigned long، unsigned long USHRT_MAXlongUINT_MAXULONG_MAXULLONG_MAX
  • CHAR_MIN– الحد الأدنى الممكن لقيمة الحرف
  • 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>ملف الرأس، وهي متوفرة أيضًا في <stdint.h>ملف الرأس. يمكن تصنيف الأنواع إلى الفئات التالية:

  • أنواع الأعداد الصحيحة ذات العرض المحدد، والتي تضمن امتلاكها نفس عدد البتات (n) في جميع التطبيقات. يتم تضمينها فقط إذا كانت متوفرة في التطبيق.
  • أنواع الأعداد الصحيحة ذات العرض الأدنى، والتي تُضمن كونها أصغر نوع متاح في التطبيق، وتحتوي على عدد بتات محدد على الأقل (n) . يُضمن تحديدها على الأقل لقيم N=8، 16، 32، 64.
  • أسرع أنواع الأعداد الصحيحة التي تضمن كونها أسرع نوع عدد صحيح متاح في التطبيق، والتي تحتوي على عدد بتات محدد على الأقل n . يُضمن تحديدها على الأقل لقيم N=8، 16، 32، 64.
  • أنواع المؤشرات الصحيحة التي تضمن قدرتها على احتواء مؤشر. يتم تضمينها فقط إذا كانت متوفرة في التنفيذ.
  • أنواع الأعداد الصحيحة ذات العرض الأقصى والتي تضمن أن تكون أكبر نوع عدد صحيح في التنفيذ.

يلخص الجدول التالي الأنواع والواجهة اللازمة للحصول على تفاصيل التنفيذ ( يشير n إلى عدد البتات):

نوع الفئةأنواع التوقيعالأنواع غير الموقعة
يكتبالحد الأدنى للقيمةالقيمة القصوىيكتبالحد الأدنى للقيمةالقيمة القصوى
العرض الدقيقintn_tINTn_MININTn_MAXuintn_t0UINTn_MAX
أقل عرضint_leastn_tINT_LEASTn_MININT_LEASTn_MAXuint_leastn_t0UINT_LEASTn_MAX
الأسرعint_fastn_tINT_FASTn_MININT_FASTn_MAXuint_fastn_t0UINT_FASTn_MAX
مؤشرintptr_tINTPTR_MININTPTR_MAXuintptr_t0UINTPTR_MAX
أقصى عرضintmax_tINTMAX_MININTMAX_MAXuintmax_t0UINTMAX_MAX

محددات تنسيق printf و scanf

يُوفّر ملف <inttypes.h>الرأس ميزات تُحسّن وظائف الأنواع المُعرّفة فيه <stdint.h>. فهو يُعرّف وحدات ماكرو لمُحدّدات تنسيق السلاسل النصية printf و scanf المُطابقة للأنواع المُعرّفة في ملف الرأس، <stdint.h>بالإضافة إلى العديد من الدوال للتعامل مع هذه intmax_tالأنواع uintmax_t. أُضيف ملف الرأس هذا في C99 .

سلسلة تنسيق printf

تأتي وحدات الماكرو بالصيغة التالية : . هنا، يُحدد {fmt} تنسيق الإخراج، وهو أحد الخيارات التالية: (عشري)، (ست عشري)، (ثماني)، (عدد صحيح غير مُوقّع)، و (عدد صحيح). يُحدد {type} نوع الوسيط، وهو أحد الخيارات التالية : ، ، ، ، ، ، حيث يُشير إلى عدد البتات في الوسيط.PRI{fmt}{type}dxouinFASTnLEASTnPTRMAXn

سلسلة تنسيق scanf

تأتي وحدات الماكرو بالصيغة التالية : . هنا، يُحدد {fmt} تنسيق الإخراج، وهو أحد الخيارات التالية: (عشري)، (ست عشري)، (ثماني)، (عدد صحيح غير مُوقّع)، و (عدد صحيح). يُحدد {type} نوع الوسيط، وهو أحد الخيارات التالية : ، ، ، ، ، ، حيث يُشير إلى عدد البتات في الوسيط.SCN{fmt}{type}dxouinFASTnLEASTnPTRMAXn

الوظائف

أنواع إضافية من الأرقام العشرية

على غرار أنواع الأعداد الصحيحة ذات العرض الثابت، تحدد المواصفة القياسية ISO/IEC TS 18661 أنواع الأعداد العشرية لتبادل IEEE 754 والتنسيقات الموسعة بالنظامين الثنائي والعشري:

  • _FloatNبالنسبة لتنسيقات التبادل الثنائي؛
  • _DecimalNبالنسبة لتنسيقات التبادل العشري؛
  • _FloatNxللتنسيقات الثنائية الموسعة؛
  • _DecimalNxللصيغ العشرية الموسعة.

نصائح

لكل نوع بيانات مؤشرٌT مُقابل . المؤشر هو نوع بيانات يحتوي على عنوان موقع تخزين لمتغير من نوع مُحدد. تُعلن المؤشرات باستخدام مُعرّف النوع النجمي (*) بعد نوع التخزين الأساسي وقبل اسم المتغير. المسافة البيضاء قبل أو بعد النجمة اختيارية.T*

char * p ; long * q ; int * r ;

يمكن أيضًا تعريف المؤشرات لأنواع بيانات المؤشرات، مما يُنشئ مؤشرات غير مباشرة متعددة، مثل char **المؤشرات int ***إلى المصفوفات. وتُعدّ هذه الأخيرة أقل شيوعًا من مصفوفة المؤشرات، وقد يكون تركيبها مُربكًا.

char * pc [ 10 ]; // مصفوفة من 10 عناصر من نوع 'مؤشر إلى حرف' char ( * pa )[ 10 ]; // مؤشر إلى مصفوفة من 10 عناصر من نوع char

يتطلب العنصر pcعشرة كتل من الذاكرة بحجم المؤشر إلىchar (عادة 40 أو 80 بايت على المنصات الشائعة)، ولكن العنصر paهو مؤشر واحد فقط (بحجم 4 أو 8 بايت)، والبيانات التي يشير إليها هي مصفوفة من عشرة بايت ( ).sizeof*pa==10

تحتوي لغة C أيضًا على "مؤشر إلى void" void *. [ 18 ]void لا يعني اسم "مؤشر إلى " أنه يشير إلى voidالذاكرة (كما voidهو الحال مع نوع غير مكتمل بدون حجم)، بل يشير إلى شيء من نوع غير محدد. يجب تحويله إلى نوع مؤشر آخر قبل إمكانية الوصول إليه. void *قد لا يشير المؤشر إلى دالة. استدعاء الدالة mallocيُرجع قيمة void *، freeويأخذ قيمة void *.

تستخدم لغة C مفهوم المؤشر الفارغ للدلالة على مؤشر لا يشير إلى أي بيانات صالحة. NULLغالبًا ما يُستخدم الماكرو بدلاً من المؤشر الفارغ، معتمدًا على التحويل الضمني للأنواع كلما أمكن. مع ذلك، قد يكون هذا الاستخدام إشكاليًا ومصدرًا لأخطاء برمجية. على وجه الخصوص، NULLقد يكون لتوسيع المؤشر الفارغ نوع مؤشر أو نوع عدد صحيح، اعتمادًا على التنفيذ. قدمت C23 الثابت المُعرَّف مسبقًا nullptrونوعه nullptr_t(الذي له القيمة الوحيدة nullptr) للتعبير عن ثابت المؤشر الفارغ. nullptrيُعد مؤشرًا بشكل قاطع، ويمكن تحويله إلى أي مؤشر كائن أو دالة، ويسمح nullptr_tبحالة خاصة في _Generic. [ 19 ] حجم هذا النوع ومحاذاته مماثلان لمؤشر إلى نوع حرفي (أو void *)، ولكن قد يكون لأنواع المؤشرات الأخرى حجم ومحاذاة مختلفان؛ وبالتالي، لا يمكن استبدال جميع المؤشرات الفارغة بـ nullptr. [ 20 ]

المصفوفات

لكل نوع T، باستثناء أنواع void والدوال، يوجد نوع "مصفوفة من Nعناصر من النوع T" . المصفوفة هي مجموعة من القيم، جميعها من نفس النوع، مخزنة بشكل متجاور في الذاكرة. Nيتم فهرسة مصفوفة بحجم معين بواسطة أعداد صحيحة من 00 إلى 1. N − 1إليك مثال موجز:

int a [ 10 ]; // مصفوفة من 10 عناصر، كل منها من نوع عدد صحيح

يمكن تهيئة المصفوفات باستخدام مُهيئ مُركب، ولكن لا يمكن إسناد قيم لها. تُمرر المصفوفات إلى الدوال بتمرير مؤشر إلى العنصر الأول. تُعرَّف المصفوفات متعددة الأبعاد على أنها "مصفوفة من المصفوفات ..." ، ويجب أن يكون لجميع الأبعاد، باستثناء البعد الخارجي، حجم ثابت وقت الترجمة.

int aa [ 10 ][ 8 ]; // مصفوفة من 10 عناصر، كل عنصر منها من نوع 'مصفوفة من 8 عناصر عددية صحيحة'

في لغة C، غالبًا ما يتم تخزين السلسلة كمصفوفة من الأقواس char( char[])، ولكن هذا يختلف عن المؤشر إلى الأقواس char( char *). char[]لا يمكن إعادة تعيين الأقواس، وتوجد في المكان الذي تم تعريفها فيه، بينما char *يمكن إعادة تعيين الأقواس، ولكن لا يمكن تعديلها.

char s [] = "Hello, world!" ; char * p = s ; // s يتحول إلى &s[0]، وp يشير إلى الحرف الأول

حتى لو أخذت الدالة T[]كمعامل، فإنها تتحلل إلى T *قيمة تشير إلى عنصرها الأول.

void f ( int a []);// هذا هو نفسه: void f ( int * a );

يتم تعريف فهرسة المصفوفة من حيث حساب المؤشرات ، أي a[i]أنها تعادل *(a + i). [ 21 ]

التعدادات

في لغة C، يُعدّ التعداد نوعًا من أنواع البيانات الصحيحة التي تقتصر قيمها على مجموعة من الثوابت المُسماة. [ 22 ] لا يمكن تعريف التعدادات مسبقًا. كما يمكن إسناد قيم إليها مباشرةً، وتُستخدم عادةً switchلتعداد حالات متعددة.

#include <stddef.h>enum Status { OK = 200 , NOT_FOUND = 404 , SERVER_ERROR = 500 };const char * get_status_string ( enum Status status ) { switch ( status ) { case OK : return "Success" ; case NOT_FOUND : return "Not found" ; case SERVER_ERROR : return "Server error" ; default : unreachable (); } }

تُعرف ثوابت التعداد في وقت الترجمة، وغالبًا ما تكون وسيلة أكثر أمانًا لتعريف الثوابت الصحيحة من وحدات الماكرو. عادةً ما يكون الحجم الأساسي للتعداد هو int، ولكن منذ C23، يمكن تحديد الحجم الأساسي للتعداد مباشرةً ليكون أي نوع صحيح.

enum Color : char { RED = 1 , ORANGE , YELLOW , GREEN , BLUE , INDIGO , VIOLET };

لأن أنواع البيانات المُعدّدة ليست آمنة من حيث النوع، يمكن إسناد قيمة من نوع بيانات مُعدّد آخر إليها. كما لا يشترط أن تكون قيم أنواع البيانات المُعدّدة ضمن نطاق القيم المُحددة.

enum Color color = YELLOW ; // YELLOW = 3 enum Month month = JUNE ; // JUNE = 6اللون = الشهر ؛ // اللون الآن هو 6 (نيلي) الشهر = 999 ؛ // قد لا توجد قيمة 999 في تعداد الشهر، ولكنها لا تزال مسموحة

الهياكل

تُجمّع الهياكل (structs) تخزين عناصر بيانات متعددة، قد تختلف أنواعها، في كتلة ذاكرة متجاورة واحدة يُشار إليها بواسطة متغير واحد. قد تُضاف حشوات إلى عناصرها لتحسين محاذاة الذاكرة ، ولذلك يُنصح غالبًا بترتيب الحقول من الأكبر حجمًا إلى الأصغر حجمًا لتحقيق استخدام أمثل للذاكرة.

struct Student { char name [ 50 ]; unsigned int id ; unsigned int chapter ; float gpa ; };// تهيئة موضعية - القيم تطابق ترتيب الحقول struct Student alice = { "Alice" , 123 , 2 , 3.8 }; // مُهيئ مُحدد (منذ C99) struct Student bob = { . name = "Bob" , . id = 246 , . chapter = 1 , . gpa = 3.9 };

قد تستخدم الهياكل أيضًا حقول البت للسماح للحقول بمشاركة وحدات التخزين نفسها، ولكن يتم تحديد التخطيطات من قبل التنفيذ.

struct Properties { // يمكن ضغط ثلاثة حقول في بايت واحد unsigned char visible : 1 ; // a يشغل بت واحد unsigned char color : 3 ; // b يشغل 3 بتات unsigned char size : 4 ; // c يشغل 4 بتات };

يُعدّ تخطيط الذاكرة للبنية مسألةً خاصة بتنفيذ اللغة لكل منصة، مع بعض القيود. يجب أن يكون عنوان الذاكرة للعضو الأول مطابقًا لعنوان البنية نفسها. يمكن تهيئة البنى أو إسناد قيم إليها باستخدام القيم المركبة. يمكن للدالة أن تُرجع بنيةً مباشرةً، على الرغم من أن هذا غالبًا ما يكون غير فعال أثناء التشغيل. منذ معيار C99 ، يمكن أن تنتهي البنية أيضًا بعضو مصفوفة مرن .

يمكن للدوال أن تأخذ بنية بيانات كمعامل بالقيمة، لكن هذا مكلف لأنه ينسخ البنية بأكملها. في المقابل، يُفضل تمريرها عبر مؤشر لأن حجم المؤشر معروف (عادةً 4 أو 8 بايت).

#include <stdio.h>// تمرير القيمة void print_student ( struct Student s ) { printf ( "الاسم: %s، الرقم التعريفي: %d، في الفصل الدراسي %d، بمعدل تراكمي: %.2f \n " , s . name , s . id , s . chapter , s . gpa ); }// تمرير البيانات بواسطة مؤشر void print_student ( struct Student * s ) { printf ( "الاسم: %s، الرقم الجامعي: %d، الفصل الدراسي %d، المعدل التراكمي: %.2f \n " , s -> name , s -> id , s -> chapter , s -> gpa ); }

يمكن أن تتكون الهياكل من هياكل أخرى:

struct Date { int year ; int month ; int day ; };struct Birthday { char name [ 50 ]; struct Date dob ; };

يُستخدم عادةً هيكل البيانات الذي يحتوي على مؤشر إلى هيكل بيانات من نوعه الخاص لبناء هياكل البيانات المرتبطة :

struct LinkedList { void * item ; // يخزن العنصر الحالي struct LinkedList * next ; // يخزن القائمة التالية، أو NULL إذا لم يكن هناك عنصر تالٍ };

النقابات

نوع الاتحاد هو بنية خاصة تسمح بالوصول إلى نفس كتلة الذاكرة باستخدام مجموعة مختارة من أوصاف الأنواع المختلفة.

// يحتوي على قيمة عددية صحيحة أو عشرية، اتحاد الأرقام { عدد صحيح i ؛ عدد عشري f ؛ } d ؛d.i = 10 ; // قيمة d الآن هي 10 d.f = 3.14f ; // قيمة d الآن هي 3.14، مما يؤدي إلى استبدال القيمة 10

في المثال التالي، يمكن تعريف اتحاد لأنواع البيانات للسماح بقراءة نفس البيانات إما كعدد صحيح، أو عدد عشري، أو أي نوع آخر يحدده المستخدم:

اتحاد { عدد صحيح i ؛ عدد عشري f ؛ بنية { عدد صحيح غير مُوقّع u ؛ عدد عشري 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) مستخدم هنا.

يتم استدعاء مؤشرات الدوال بالاسم تمامًا مثل استدعاءات الدوال العادية.

#include <stdio.h> #include <stdlib.h>int ( * my_abs )( int ) = & abs ; int x = -42 ; int abs_of_x = my_abs ( x ); printf ( "abs(%d) = %d \n " , x , abs_of_x );

محددات النوع

يمكن تمييز الأنواع المذكورة أعلاه بشكل أكبر باستخدام مُحدِّدات النوع ، مما ينتج عنه نوع مؤهل . اعتبارًا من عام 2014وفي لغة C11 ، توجد أربعة محددات للأنواع في لغة C القياسية:

  • const( C89 )
  • volatile( C89 )
  • restrict( C99 )
  • _Atomic( C11 ) - يحتوي الأخير على اسم خاص لتجنب التعارض مع أسماء المستخدمين، [ 23 ] ولكن يمكن استخدام الاسم الأكثر شيوعًا إذا تم تضمين العنوان. atomic<stdatomic.h>

من بين هذه المحددات، constيُعدّ المحدد الأكثر شهرةً واستخدامًا ، إذ يظهر في مكتبة لغة C القياسية ويُصادف في أي استخدامٍ هام للغة C، والذي يجب أن يستوفي شرط صحة الثوابت . أما المحددات الأخرى فتُستخدم أساسًا في البرمجة منخفضة المستوى: يهدف المحدد الأول إلى منع تحسينات المُصرّف على متغيرٍ ما من خلال الإشارة إلى إمكانية تغييره في أي وقت، بينما يشير المحدد الثاني إلى أن الكائن الذي يُشير إليه المؤشر لا يُمكن الوصول إليه إلا من خلال ذلك المؤشر، ويشير المحدد الثالث إلى أن الكائن "ذري"، أي أن عمليات القراءة والكتابة غير قابلة للتجزئة.volatilerestrict_Atomic

انظر أيضاً

مراجع

  1. بار، مايكل (2 ديسمبر 2007). "الأعداد الصحيحة ذات العرض الثابت القابلة للنقل في لغة سي" . تم الاسترجاع في 18 يناير 2016 .
  2. 1 2 مواصفات ISO/IEC 9899:1999، TC3 (PDF) . ص 255، § 7.18 أنواع الأعداد الصحيحة <stdint.h> .
  3. "أنواع الحساب" . cppreference.com . تم الاطلاع عليه بتاريخ 15 سبتمبر 2025 .
  4. 1 2 3 4 5 6 7 8 9 10 مواصفات ISO/IEC 9899:1999، TC3 (PDF) . ص 22، § 5.2.4.2.1 أحجام أنواع الأعداد الصحيحة <limits.h> .
  5. الأساس المنطقي للمعيار الدولي - لغات البرمجة - C المراجعة 5.10 (PDF) . ص 25، § 5.2.4.2.1 أحجام أنواع الأعداد الصحيحة <limits.h> .
  6. مسودة مواصفات ISO/IEC 9899:2023 (PDF) . ص 41، § 6.2.6 تمثيلات الأنواع .
  7. "حدود الأعداد الصحيحة في لغتي C و C++" . 21 يوليو 2023.
  8. 1 2 مواصفات ISO/IEC 9899:1999، TC3 (PDF) . ص 37، § 6.2.6.1 تمثيلات الأنواع - عام .
  9. 1 2 3 4 5 6 مواصفات ISO/IEC 9899:1999، TC3 (PDF) . ص 56، § 6.4.4.1 الثوابت العددية .
  10. "نماذج البرمجة 64 بت: لماذا LP64؟" . مجموعة أوبن . تم الاطلاع عليه في 9 نوفمبر 2011 .
  11. "عرض النوع (مكتبة GNU C)" . www.gnu.org . تم الاطلاع عليه بتاريخ 30 يوليو 2022 .
  12. "<limits.h>" . pubs.opengroup.org . تم الاطلاع عليه بتاريخ 30 يوليو 2022 .
  13. مواصفات ISO/IEC 9899:1999، TC3 (PDF) . ص 67، § 6.5 التعبيرات .
  14. معهد مهندسي الكهرباء والإلكترونيات (IEEE) ومجموعة Open Group (2024). "<stdbool.h>" . pubs.opengroup.org . معيار IEEE 1003.1-2024.
  15. cppreference.com. "رأس المكتبة القياسية <stdbool.h>" . cppreference.com . cppreference.com . تم الاطلاع عليه بتاريخ 7 فبراير 2026 .
  16. مسودة مواصفات ISO/IEC 9899:2023 (PDF) . ص 37، § 6.2.5 الأنواع .
  17. مجموعات الأعداد الصحيحة، الإصدار 3، WG14 N 3699. ص. 6، § 1.2 الأعداد الصحيحة الدقيقة على مستوى البت .
  18. مواصفات ISO/IEC 9899:1999، اللجنة الفنية 3 (ملف PDF) . صفحة 47، الفقرة 6.3.2.3 المؤشرات .
  19. cppreference.com. "nullptr_t" . cppreference.com . cppreference.com . تم الاطلاع عليه بتاريخ 7 فبراير 2026 .
  20. "WR14-N3042: تقديم الثابت nullptr" . open-std.org . 22 يوليو 2022. مؤرشف من الأصل في 24 ديسمبر 2022.
  21. بلاوجر، بي جيه ؛ برودي ، جيم (1992). مرجع مبرمج لغة سي وفقًا لمعايير ANSI وISO . ريدموند، واشنطن: مطبعة مايكروسوفت. ص 108. ISBN  978-1-55615-359-4.
  22. cppreference.com. "التعدادات" . cppreference.com . cppreference.com . تم الاطلاع عليه بتاريخ 7 فبراير 2026 .
  23. C11: معيار C الجديد ، توماس بلام