تحويل الأنواع في لغة C: التحويل الضمني والصريح
⚡ ملخص ذكي
يقوم تحويل النوع في لغة 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
- في المثال الموضح، أعلنا عن متغير من نوع البيانات القصيرة بقيمة تمت تهيئتها بالقيمة 10.
- في السطر الثاني، قمنا بتعريف متغير من نوع البيانات int.
- في السطر الثالث، قمنا بتعيين قيمة المتغير 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 قد رُقّيت إلى النوع عدد صحيح.
- يحدث تحويل النوع الضمني دائمًا مع أنواع البيانات المتوافقة.
لا يمكننا إجراء عملية صب النوع الضمني على أنواع البيانات غير المتوافقة مع بعضها البعض مثل:
- سيؤدي تحويل التعويم إلى int إلى اقتطاع جزء الكسر وبالتالي فقدان معنى القيمة.
- تحويل العدد المزدوج إلى عدد عشري سيؤدي إلى تقريب الأرقام لأعلى.
- سيؤدي تحويل عدد صحيح طويل إلى عدد صحيح إلى حدوث خطأ.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
- لقد قمنا بتهيئة المتغير "a" من النوع float.
- بعد ذلك، لدينا متغير آخر 'b' من نوع بيانات عدد صحيح. بما أن المتغيرين 'a' و'b' من نوعين مختلفين، فإن لغة 'C' لن تسمح باستخدام هذا التعبير وستُظهر خطأً. في بعض إصدارات لغة 'C'، سيتم تقييم التعبير ولكن النتيجة لن تكون مرغوبة.
- لتجنب مثل هذه المواقف، قمنا بطباعة المتغير 'a' من النوع float. باستخدام أساليب صب النوع الصريح، نجحنا في تحويل عدد عشري إلى عدد صحيح من نوع البيانات.
- لقد طبعنا قيمة "a" التي لا تزال عائمة
- بعد الطباعة، ستكون النتيجة دائمًا عددًا صحيحًا 'b'.
بهذه الطريقة، يمكننا تنفيذ صب النوع الصريح في برمجة C.



