في الكود البرمجي الذي قدمته، يتم استخدام مواصف النوع (specifier) للعدد الصحيح %d
في دالة printf
لطباعة قيمة عائمة (floating-point). هذا يؤدي إلى نتائج غير متوقعة، وهو ما يحدث بسبب التبديل في التمثيل الداخلي للأعداد في الذاكرة.
في السطر:
cprintf("%d\n", 5 / (float)4.7);
يتم قسم 5 على (float)4.7
، وهذا يؤدي إلى الحصول على قيمة عائمة (floating-point). ومع ذلك، عندما يتم تنسيقها باستخدام %d
، يتم فرض تمثيلها كرقم صحيح، مما يؤدي إلى فقدان الأرقام العشرية والاحتفاظ فقط بالجزء الصحيح من القيمة. في هذه الحالة، يتم تحويل قيمة العائمة إلى عدد صحيح.
هنا يكمن سبب النتيجة 1610612736. يجب أن تكون القيمة المتوقعة هي 1، ولكن بسبب استخدام مواصف النوع الخاطئة في printf
، يتم تفسير القيمة العائمة بشكل غير صحيح.
لتصحيح هذا، يجب استخدام مواصف النوع الصحيحة للقيمة العائمة، وهي %f
. لذا، يمكنك تحديث الكود كالتالي:
cprintf("%f\n", 5 / (float)4.7);
باستخدام %f
ستحصل على النتيجة المتوقعة 1.000000.
المزيد من المعلومات
عند التعامل مع لغة البرمجة C، يتعين عليك أن تكون حذرًا عند استخدام مواصفات النوع في دوال الإدخال والإخراج مثل printf
و scanf
. استخدام مواصف النوع الخاطئة يمكن أن يؤدي إلى تفسير غير صحيح للبيانات والنتائج غير المتوقعة.
لفهم أفضل حول ما حدث في الكود البرمجي، دعنا نقوم بتفحص الكود بشكل أكثر تفصيلًا.
cint main(void)
{
printf("%d\n", 5 / (float)4.7);
printf("Size of int = %d", sizeof(int));
return 1;
}
-
السطر الأول:
printf("%d\n", 5 / (float)4.7);
- هنا يتم قسم 5 على
(float)4.7
، وهو ينتج قيمة عائمة. ومع ذلك،%d
فيprintf
يعامل القيمة عائمة كعدد صحيح، مما يؤدي إلى طباعة نتيجة غير متوقعة.
- هنا يتم قسم 5 على
-
السطر الثاني:
printf("Size of int = %d", sizeof(int));
- هذا السطر يقوم بطباعة حجم نوع البيانات
int
باستخدامsizeof
، ولكن هنا يتم استخدام%d
، وهو مواصف النوع المخصصة للأعداد الصحيحة، وليس للقيمة التي تعيدsizeof
التي هي بالفعل قيمة صحيحة.
- هذا السطر يقوم بطباعة حجم نوع البيانات
لتحسين الكود وتصحيح هذه المشكلتين، يمكنك استخدام %f
للقيمة العائمة و %zu
لحجم النوع:
cint main(void)
{
printf("%f\n", 5 / (float)4.7);
printf("Size of int = %zu", sizeof(int));
return 1;
}
باستخدام هذه التغييرات، سيتم طباعة القيمة العائمة بشكل صحيح وحجم النوع int
سيتم طباعته بشكل صحيح أيضًا.