• 0
هاني الأتاسي

سلسلة - شغل مخك ( 28 )

سؤال

:rolleyes:

هذا السؤال مختص بمبرمجي السي ..

ماهي أفضل طريقة لكتابة الثابت MAX_INT ؟

#define MAX_INT              ??????

MAX_INT يجب أن تعطينا أكبر رقم يمكن أن يستوعبه النوع int في السي..

---------

بقية السلسلة تجدها هنا: http://www.arabteam2000-forum.com/index.php?showtopic=48850

تم تعديل بواسطه هاني الأتاسي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

7 إجابة على هذا السؤال .

  • 0

ربما

#define MAX_INT   (int)((unsigned)~0 >> 1)

أو

#define MAX_INT         INT_MAX

أو أي رقم تحدده أنت

#define   MAX_INT   16

لا كن حذاري مما قد يحصل من أخطاء من جراء القيمة التي تحددها

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السؤال مش واضح كويس , على ما فهمت تكون الاجابه بهذا الشكل

#define MAX_INT  0xffffffff

وتعمل بهذا الشكل

#include <stdio.h>
#define MAX_INT  0xffffffff
void main(void) {
 printf("%u\n", MAX_INT);
}

يا ريت توضح السؤال والمطلوب اكثر

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ما رايك يا هاني بهذه القيمة

pow(2,8*sizeof(int))-1

تم تعديل بواسطه عماد الخليل
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أعتقد أن عماد الخليل جابها صح :D ,,,

المشكلة ومافيها أن int حجمه متغير حسب نظام التشغيل ,,

ففي أنظمة 16 بت كالدوز ووندوز 3x , كان حجم ال int يساوي 16 بت "تعود هذه السياسة لمصرفات سي++ لاأعلم كلها أم بعضها " لكن مثلا في باسكال لايوجد شيء كهذا ,,

في أنظمة 32 بت , حجم int سيساوي 32 بت ,

في أنظمة 64 بت حجم int سيساوي 64 بت ,,

لكن إن أردت أن تحدد حجم بيانات أو معطيات بحجم معين :

16 bit تكون short,INT16

32 bit تكون INT32 أو long

64 Bit تكون INT64 أو long int مع أني لم أجربها ..

وإقتراح عماد متغير حيث أن sizeof(int) ستحدد من جراء نظام التشغيل وستكون القيمة الصحيحة دائما حسب نظام التشغيل , أما القيم الثابتة فهي مشكلة في حد ذاتها ,,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

B)

شو هالتشغيل المخ هذا :rolleyes: ماحدا حل السؤال صح :blink: ..

تحليلHGB وعماد خليل صحيحن . لكن حل عماد بدو معالجين ليجيب القيمة بسرعة ;) فالحل جدا بطيئ ويستخدم double or float . فint تعتمد على المعالج فقد تكون 16 بت في معالجات 16 بت و32 بت في معالجات 32 بت ..

Asm4All حلك يعمل فقط على معالجات 32 بت وهو يعطي قيمة Max Unsigned Int

الحل الأظبط للأخ DeltaAziz ولكن فيه مشكلة أن بعض المترجمات قد تعتبر الصفر ليست قيمة int وعند القلب ثم التحويل إلى unsigned يمكن أن يتحتوي الجزء العلوي على أصفار. حلك يعمل في فجوال ستديو ولكن قد لا يعمل في باقي المترجمات.

#define MAX_INT   (int)((unsigned)~0 >> 1)

بالنسبة لي أنا أحلها كالتالي:

#define MAX_INT  (int)((unsigned)(int)-1 >> 1)

أكبر عدد في int هو عبارة عن العدد الذي يكون جميع خاناته واحد باستثناء الخانة العليا فتكون 0 ..

القيمة -1 تبقى -1 إذا تم تحويلها من short إلى int وهكذا . وهي عبارة عن بت ذو القيمة 1 في كل خانات الرقم . بعدها نحولها إلى unsigned ومن ثم نزيحها إلى اليمين بمقدار واحد بت.

:)

تم تعديل بواسطه هاني الأتاسي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

#include <stdio.h>
#define MAX_INT  ((unsigned int)0xffffffff) >> 1
void main(void) {
 printf("%i\n", MAX_INT);
}

جرب الكود يا اخ هاني على اي مترجم سواء كان 16 أو 32 بيت

انا جربته على BORLANDC 16 bit طبع 32767

وجربته على vc 2003 32 bit طبع 2147483647

حد تاني يجربه عنده

فكرتها :

معي 32 بيت وحايد يأخذ منها بطول unsigned int

في 16 بيت بيكون 16 وفي 32 بيت بيكون 32

بعدها يتم عمل ازاحه لليمين و وضع 0 في اقصى اليسار

في حالة 16 بيت يبقى معانا 15 واحد

في حالة 32 بيت يبقى معانا 31 واحد

وآخر بيت صفر

تم تعديل بواسطه Asm4all
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اخي asm4all .. مافي فرق بين حلك الأخير والحل الذي وضعته ووضعه الأخ DeltaAziz .. سوى أنك نسيت أن ترجع وتحول الجواب النهائي إلى (int)

في معالجات 32 بت

-1 == 0xFFFFFFFF و

~0 == 0xFFFFFFFF

في معالجات 16 بت

-1 == 0xFFFF و

~0 == 0xFFFF

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .