تحويل الأنواع في لغة C: التحويل الضمني والصريح

⚡ ملخص ذكي

يقوم تحويل النوع في لغة C بتحويل نوع بيانات إلى نوع آخر، إما ضمنيًا عندما يقوم المترجم بترقية نوع متوافق أصغر تلقائيًا أو بشكل صريح عندما يفرض المبرمج التحويل باستخدام عامل التحويل للتحكم في الدقة ومنع النتائج غير المتوقعة.

  • 🔄 شكلان: يتم تنفيذ التحويل الضمني تلقائيًا؛ أما التحويل الصريح فيتم كتابته باستخدام عامل التحويل.
  • ⬆️ نوع العرض الترويجي: إن تحويل نوع أصغر إلى نوع أكبر متوافق، مثل تحويل نوع قصير إلى نوع صحيح، يحافظ على القيمة.
  • ✂️ مخاطر فقدان البيانات: تؤدي عمليات التحويل الضيقة مثل تحويل النوع من float إلى int إلى حذف الكسر وفقدان المعنى.
  • 🎯 الصيغة الصريحة: كتابة تعبير (اسم النوع) يجبر على إجراء تحويل، مثل تحويل معاملات الأعداد الصحيحة إلى أعداد عشرية.
  • 🤖 مساعدة الذكاء الاصطناعي: يقوم مساعدو الذكاء الاصطناعي و GitHub Copilot بصياغة تعبيرات التحويل وتحديد عمليات التحويل الضيقة الخطرة.

تحويل الأنواع في لغة C

ما هو Typecasting في C؟

تحويل النوع هو تحويل نوع بيانات إلى نوع آخر. ويطلق عليه أيضًا تحويل البيانات أو تحويل النوع في لغة C. وهو أحد المفاهيم المهمة التي تم تقديمها في برمجة "C".

توفر برمجة "C" نوعين من عمليات صب النوع:

  • نوع الصب الضمني
  • صب نوع صريح

نوع الصب الضمني

يعني التحويل الضمني للأنواع تحويل أنواع البيانات دون فقدان معناها الأصلي. يُعد هذا النوع من التحويل ضروريًا عندما تريد تغيير أنواع البيانات دون تغيير دلالة القيم المخزنة بداخلها. متغير.

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

#include<stdio.h>
int main(){
	short a=10; //initializing variable of short data type
	int b; //declaring int variable
	b=a; //implicit type casting
	printf("%d\n",a);
	printf("%d\n",b);
}

الإخراج:

10
10

نوع الصب الضمني

  1. في المثال الموضح، أعلنا عن متغير من نوع البيانات القصيرة بقيمة تمت تهيئتها بالقيمة 10.
  2. في السطر الثاني، قمنا بتعريف متغير من نوع البيانات int.
  3. في السطر الثالث، قمنا بتعيين قيمة المتغير s للمتغير a. في السطر الثالث يتم إجراء تحويل النوع الضمني حيث يتم نسخ القيمة من المتغير s وهو من نوع البيانات القصير إلى المتغير a الذي هو من نوع البيانات int.

تحويل الحرف إلى Int

خذ بعين الاعتبار مثال إضافة حرف تم فك ترميزه في ASCII بعدد صحيح:

#include <stdio.h>
main() {
   int  number = 1;
   char character = 'k'; /*ASCII value is 107 */
   int sum;
   sum = number + character;
   printf("Value of sum : %d\n", sum );
}

الإخراج:

 Value of sum : 108

هنا، قام المترجم بترقية عدد صحيح عن طريق تحويل قيمة 'k' إلى ASCII قبل إجراء عملية الإضافة الفعلية.

التسلسل الهرمي للتحويل الحسابي

يقوم المترجم أولاً بترقية حرف إلى عدد صحيح. إذا كانت المتغيرات لا تزال تحتوي على أنواع بيانات مختلفة، فسيتم تحويلها إلى أعلى نوع بيانات يظهر في مخطط التسلسل الهرمي التالي:

التسلسل الهرمي للتحويل الحسابي

خذ بعين الاعتبار المثال التالي لفهم المفهوم:

#include <stdio.h>
main() {
   int  num = 13;
   char c = 'k'; /* ASCII value is 107 */
   float sum;
   sum = num + c;
   printf("sum = %f\n", sum );}

الإخراج:

 sum = 120.000000

أولاً وقبل كل شيء، يتم تحويل المتغير c إلى عدد صحيح، لكن المترجم يحول num و c إلى "عدد عشري" ويجمعهما لإنتاج نتيجة "عدد عشري".

نقاط مهمة حول التحويلات الضمنية

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

لا يمكننا إجراء عملية صب النوع الضمني على أنواع البيانات غير المتوافقة مع بعضها البعض مثل:

  1. سيؤدي تحويل التعويم إلى int إلى اقتطاع جزء الكسر وبالتالي فقدان معنى القيمة.
  2. تحويل العدد المزدوج إلى عدد عشري سيؤدي إلى تقريب الأرقام لأعلى.
  3. سيؤدي تحويل عدد صحيح طويل إلى عدد صحيح إلى حدوث خطأ.ping من البتات الزائدة ذات الترتيب العالي.

في جميع الحالات المذكورة أعلاه، عندما نقوم بتحويل أنواع البيانات، ستفقد القيمة معناها. بشكل عام، يتم تحذير فقدان معنى القيمة من قبل المترجم.

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

صب نوع صريح

في التحويل الضمني للنوع، يتم تحويل نوع البيانات تلقائيًا. هناك بعض السيناريوهات التي قد نضطر فيها إلى فرض تحويل النوع. لنفترض أن لدينا متغير div يخزن قسمة متغيرين معلنين كنوع بيانات int.

 int result, var1=10, var2=3;
result=var1/var2;

في هذه الحالة، بعد إجراء القسمة على المتغيرين var1 وvar2، ستكون النتيجة المخزنة في المتغير "result" بصيغة عدد صحيح. وفي كل مرة يحدث هذا، تفقد القيمة المخزنة في المتغير "result" معناها لأنها لا تأخذ في الاعتبار جزء الكسر الذي يتم الحصول عليه عادة عند قسمة رقمين.

لفرض تحويل النوع في مثل هذه المواقف، نستخدم صب النوع الصريح.

يتطلب الأمر عامل تحويل النوع. الصيغة العامة لعمليات تحويل النوع هي كما يلي:

(type-name) expression

هنا،

  • اسم النوع هو نوع بيانات اللغة القياسي "C".
  • يمكن أن يكون التعبير ثابتًا أو متغيرًا أو تعبيرًا فعليًا.

دعونا نكتب برنامجًا لتوضيح كيفية الطباعة في لغة C باستخدام عملية الكتابة الصريحة.

#include<stdio.h>
int main()
{
	float a = 1.2;
	//int b  = a; //Compiler will throw an error for this
	int b = (int)a + 1;
	printf("Value of a is %f\n", a);
	printf("Value of b is %d\n",b);
	return 0;
}

الإخراج:

Value of a is 1.200000
Value of b is 2

صب نوع صريح

  1. لقد قمنا بتهيئة المتغير "a" من النوع float.
  2. بعد ذلك، لدينا متغير آخر 'b' من نوع بيانات عدد صحيح. بما أن المتغيرين 'a' و'b' من نوعين مختلفين، فإن لغة 'C' لن تسمح باستخدام هذا التعبير وستُظهر خطأً. في بعض إصدارات لغة 'C'، سيتم تقييم التعبير ولكن النتيجة لن تكون مرغوبة.
  3. لتجنب مثل هذه المواقف، قمنا بطباعة المتغير 'a' من النوع float. باستخدام أساليب صب النوع الصريح، نجحنا في تحويل عدد عشري إلى عدد صحيح من نوع البيانات.
  4. لقد طبعنا قيمة "a" التي لا تزال عائمة
  5. بعد الطباعة، ستكون النتيجة دائمًا عددًا صحيحًا 'b'.

بهذه الطريقة، يمكننا تنفيذ صب النوع الصريح في برمجة C.

الأسئلة الشائعة

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

نعم، يمكن ذلك. تحويل العدد العشري إلى عدد صحيح يُقَطِّع الكسر، وتحويل العدد المزدوج إلى عدد عشري يُقَرِّب الأرقام، وتحويل العدد الطويل إلى عدد صحيح يُسقط البتات العليا. تبقى عمليات التحويل المُوسَّعة آمنة.

نعم. تسمح لغة C بتحويل نوع المؤشر من نوع إلى آخر، كما أن مؤشرات الكائنات تتحول إلى void* والعكس صحيح. يؤدي فك مرجعية مؤشر تم تحويله بشكل غير متوافق إلى سلوك غير محدد.

لا تحتوي لغة C إلا على تحويل القيمة (type) على نمط لغة C. C++ يضيف أربعة أنواع تحويل أسماء أكثر أمانًا - static_cast و dynamic_cast و const_cast و reinterpret_cast - مع نية أوضح يتم التحقق منها بواسطة المترجم.

تحتفظ القيمة فقط بالبتات الأقل أهمية. إذا كانت كبيرة جدًا، فإن النتيجة ستلتف أو تغير إشارتها، لذا تحقق أولًا من أنها تناسب النطاق المستهدف.

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

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

مساعد الطيار جيثب يقترح تعبيرات التحويل الضمنية والصريحة من تعليق، بما في ذلك بناء الجملة (اسم النوع). Revراجع كل اقتراح بشأن احتمالية فقدان البيانات قبل التجميع.

تلخيص هذه التدوينة بـ: