مزالق التحويل
التجاوز والاقتطاع
مزالق التحويل درس مجاني في C Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.
قد تسبب التحويلات مشكلات
تُعد التحويلات الصامتة مريحة، لكنها قد تسبب تجاوز السعة والاقتطاع ومفاجآت الإشارة. يغطي هذا الدرس هذه المشكلات.
#include <stdio.h>
int main(void) {
printf("Beware silent conversions\n");
return 0;
}تجاوز سعة الأعداد الصحيحة
يؤدي إسناد قيمة أكبر من قدرة نوع العدد الصحيح المستهدف إلى التفاف القيمة أو فقدان البيانات.
#include <stdio.h>
#include <limits.h>
int main(void) {
int max = INT_MAX;
printf("INT_MAX = %d\n", max);
return 0;
}الاقتطاع عند التضييق
يؤدي وضع قيمة كبيرة في نوع أصغر إلى الاحتفاظ بالبتات الدنيا فقط، مما يفسد العدد بصمت.
#include <stdio.h>
int main(void) {
int big = 300;
unsigned char small = (unsigned char)big;
printf("small = %d\n", small);
return 0;
}الخلط بين الموقّع وغير الموقّع
يحوّل الخلط بين النوعين الموقّع وغير الموقّع القيمة الموقّعة إلى قيمة غير موقّعة، فتحول القيم السالبة إلى أعداد موجبة هائلة.
#include <stdio.h>
int main(void) {
int a = -1;
unsigned int b = 1;
if (a > b)
printf("surprise: -1 > 1 as unsigned\n");
return 0;
}مشكلة عدّاد الحلقة
عندما ينخفض عدّاد حلقة من نوع unsigned إلى ما دون الصفر، يلتف إلى قيمة هائلة، مما يسبب حلقة لا نهائية. استخدم عدادات موقّعة عند العد التنازلي.
#include <stdio.h>
int main(void) {
for (int i = 3; i >= 0; i--)
printf("%d ", i);
printf("\n");
return 0;
}فقدان القيمة عند التحويل من float إلى int
يؤدي تحويل float إلى int إلى فقدان الكسر. وإذا تجاوزت القيمة نطاق int، تصبح النتيجة غير معرّفة.
#include <stdio.h>
int main(void) {
double d = 3.99;
int n = (int)d;
printf("n = %d\n", n);
return 0;
}فقدان الدقة عند التحويل من double إلى float
يؤدي تخزين double عالي الدقة في float إلى حذف أرقام، وقد يتراكم ذلك في الحسابات الطويلة.
#include <stdio.h>
int main(void) {
double d = 1.123456789012345;
float f = (float)d;
printf("%.7f\n", f);
return 0;
}مفاجآت إشارة char
تُحدَّد إشارة char بحسب التنفيذ. استخدم unsigned char لقيم البايتات لتجنب النتائج السالبة.
#include <stdio.h>
int main(void) {
unsigned char b = 200;
printf("b = %d\n", b);
return 0;
}القسمة ثم التحويل
لا يمكن لاستدعاء التحويل الصريح بعد إجراء قسمة صحيحة أن يستعيد الكسر المفقود. أجرِ التحويل قبل القسمة.
#include <stdio.h>
int main(void) {
int a = 7, b = 2;
double wrong = (double)(a / b);
double right = (double)a / b;
printf("%.1f vs %.1f\n", wrong, right);
return 0;
}مقارنة النطاقات
استخدم ثوابت limits.h لفهم النطاق الذي يمكن لنوع ما الاحتفاظ به قبل افتراض أن قيمةً ما ملائمة له.
#include <stdio.h>
#include <limits.h>
int main(void) {
printf("char range: %d to %d\n", CHAR_MIN, CHAR_MAX);
return 0;
}التحويلات الدفاعية
تحقق من النطاقات قبل التضييق، وفضّل الأنواع الأوسع عند الشك، واجعل التحويلات الصريحة واضحة حتى يكون القصد مفهومًا.
#include <stdio.h>
int main(void) {
long value = 200;
if (value >= 0 && value <= 255)
printf("fits in a byte: %ld\n", value);
return 0;
}اختبار سريع
اختبر مدى فهمك لمشكلات التحويل.
مراجعة: مشكلات التحويل
تعلمت مخاطر التحويلات الصامتة.
- قد يؤدي التضييق إلى تجاوز السعة أو الاقتطاع
- يؤدي الخلط بين الموقّع وغير الموقّع إلى عكس نتائج المقارنات
- تلتف العدادات غير الموقّعة عند النزول إلى ما دون الصفر
- أجرِ التحويل قبل القسمة للحفاظ على الكسور
- تحقق من النطاقات واجعل التحويلات الصريحة واضحة
الأسئلة الشائعة
هل درس «مزالق التحويل» مجاني؟
نعم — نص درس «مزالق التحويل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.
ماذا ستتعلم في «مزالق التحويل»؟
التجاوز والاقتطاع تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟
لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «مزالق التحويل»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟
نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.