الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تساؤل حول أحجام البيانات في لغتي السي و السي++.

بدأه khaled_prg في 2 يوليو 2010 · 25 رد · 1,849 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته

سؤالي اليوم ربما يكون بدائيا ...! و لكنني و جدت بعض التعارض بين المترجمين borland c++ v 4.5 و dev c++ , لذلك أردت أن أطرح عليكم يبعض الأسئلة لكي تتضح لي المسألة.

الأسئلة تتعلق بتنفيذ الكود الآتي في المترجمين البورلاند و الديف:

#include<stdio.h>
int main()
{
printf("%d\n",sizeof(short));
printf("%d\n",sizeof(int));
printf("%d\n",sizeof(long));
printf("%d\n",sizeof(float));
printf("%d\n",sizeof(double));
printf("%d\n",sizeof(long double));
getchar();
return 0;
}

بالنسبة للبولاند فقد كانت النتائج كالتالي:

حجم short يساوي 2 بايت

حجم int يساوي 2 بايت

حجم long يساوي 4 بايت

حجم float يساوي 4 بايت

حجم double يساوي 8 بايت

حجم long double يساوي 10 بايت

أما الديف فقد أظهر النتائج التالية:

حجم short يساوي 2 بايت

حجم int يساوي 4 بايت

حجم long يساوي 4 بايت

حجم float يساوي 4 بايت

حجم double يساوي 8 بايت

حجم long double يساوي 12 بايت

و مما جعلني أرتبك اختلاف المترجمين في حجم int و long double مما جعلني أشك في معلوماتي أصلا ...!

السؤال الآن هو:

1-ما هو حجم int و long double و هل يختلف باختلاف المترجم !؟ أم أنه من ثوابت اللغة !؟ و هل يختلف في لغتي السي و السي++ !؟

2-بافتراض أن حجم int يساوي 2 بايت و حجم float يساوي 4 بايت , ألا يمكننا الحصول على القيمة العظمى و الصغرى لـ float انطلاقا من int و ذلك بالضرب في 2 لأنه ضعف حجمه !؟

3-كيف يتساوى حجم float و حجم long مع أن قيمها العظمى و الصغرى تختلف ...!؟

بانتظار الرد و أشكركم مقدما.

#2
اقتباس
و لكنني و جدت بعض التعارض بين المترجمين borland c++ v 4.5 و dev c++

Dev++ ليس مترجم و انما هو يستخدم المترجم GCC (و اعتقد نسخه قديمه منه).

اقتباس

بالنسبة للبولاند فقد كانت النتائج كالتالي:

حجم short يساوي 2 بايت

حجم int يساوي 2 بايت

حجم long يساوي 4 بايت

حجم float يساوي 4 بايت

حجم double يساوي 8 بايت

حجم long double يساوي 10 بايت

أما الديف فقد أظهر النتائج التالية:

حجم short يساوي 2 بايت

حجم int يساوي 4 بايت

حجم long يساوي 4 بايت

حجم float يساوي 4 بايت

حجم double يساوي 8 بايت

حجم long double يساوي 12 بايت

لا يوجد نوع اسمه int فهذا هو modifier لتحديد ان نوع البيانات المستخدم هو رقم و الأنواع الرقميه هى short و long و long long.

يوجد نوع بيانات رقمى واحد فى اللغه هو int و له عدة modifier يطلق عليها length modifier و هى

[signed] short, unsigned short, [signed] long, unsigned long, [signed] long long, unsigned long long

تستخدم الـ length modifier فى تحديد مدى الأرقام الذى سيتم إستخدامه للنوع int، بالنسبه للكمله signed فهى الإفتراضيه (و لهذا تم وضعها بين brackets للدلاله انها اختياريه) و تحدد أن النوع int يمكنه ترميز الأرقام الموجبه و السالبه.

حجم النوع short هو 2 بايت و حجم النوع long هو 4 بايت و حجم النوع long long هو 8 بايت.

عندما تستخدم int فإن المترجم اما يقوم بإستخدام short او long و ذلك يعتمد على اعداداته الإفتراضيه و فى حالتك فالأول اعتمد ان int هو short و الأخير اعتمد أن int هو long.

حجم النوع float هو 4 بايت و حجم النوع double هو 8 بايت و حجم النوع long double يعتمد على المترجم بشكل اساسى فأقل حجم لهذا النوع هى 8 بايت (لإنه لا بد و أن تكون مساحته اكبر من او تساوى double).

مترجم VC يستخدم 8 بايت للنوع long double فى حين ان Intel تستخدم نوعها السئ 10 بايت.

اقتباس

1-ما هو حجم int و long double و هل يختلف باختلاف المترجم !؟ أم أنه من ثوابت اللغة !؟ و هل يختلف في لغتي السي و السي++ !؟

اللغه لا تحدد لك حجم البيانات لأنواع البيانات و لكنها تحدد القيمه العطمى و الصغرى للأنواع الرقميه و حيث ان القيمه العظمى و الصغرى لهم تستهلك مساحات بقدر 2 و 4 و 8 بايت لذا تم التعارف على ان احجام البيانات لهم هى بالمساحات السابق ذكرها و يمكنك مراجعة الملف limits.h (خلص بلغة c) و الفئه numeric_limits (خاصه بلغة cpp) حتى تتعرف بشكل اكبر على هذه الأنواع.

اقتباس

2-بافتراض أن حجم int يساوي 2 بايت و حجم float يساوي 4 بايت , ألا يمكننا الحصول على القيمة العظمى و الصغرى لـ float انطلاقا من int و ذلك بالضرب في 2 لأنه ضعف حجمه !؟

لا يمكنك هذا و السبب هو اجابة السؤال التالى.

اقتباس
3-كيف يتساوى حجم float و حجم long مع أن قيمها العظمى و الصغرى تختلف ...!؟

المساحه التى يستهلكها كلاهما هى 4 بايت و لكن ترميز الأرقام فى الذاكره لكل منهم يختلف فالنوع float يقوم بتقسيم الـ 4 بايت إلى مجموعات هى الرقم و الأس و الإشاره و كل جزء له مساحه معينه، يمكنك مراجعة 32bit Float-Point من wikipedia لمزيد من المعلومات بهذا الشأن.

بالنسبه للنوع short و long و long long فترميزهم داخل الذاكره يكون للأساس 2 و إذا كان النوع signed يستخدم أخر بت للإشاره و إذا كان النوع unsigned فالمساحه بأكملها تستهلك للرقم.

و الله ولى التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 2 يوليو 2010 في 05:30 — السبب: تصحيح معلومات (بالأحمر معلومه خاطئه، بالبنفسجى المعلومه الصحيحه)

2

مدونتي: C++ Tips and Tricks

#3

+1

اقتباس
Dev++ ليس مترجم و انما هو يستخدم المترجم GCC (و اعتقد نسخه قديمه منه).

ما فهمت ...! :blush: :blush:

ما هو المترجم GCC و ما علاقته بـ DEV ؟

اقتباس
عندما تستخدم int فإن المترجم اما يقوم بإستخدام short او long و ذلك يعتمد على اعداداته الإفتراضيه و فى حالتك فالأول اعتمد ان int هو short و الأخير اعتمد أن int هو long.

سمعتُ البعض يقول أن حجم int يعتمد على طبيعة نظام التشغيل ...! فيكون مثل short في أنظمة 16 بايت أما في أنظمة 32 بايت فيكون مثل long ! ما رأيك ؟

اقتباس
مترجم VC يستخدم 8 بايت للنوع long double فى حين ان Intel تستخدم نوعها السئ 10 بايت.

لماذا يختلف المترجمات في تعيين حجم long double ؟

و شكرا مقدما :)

#4
اقتباس
لا يوجد نوع اسمه int فهذا هو modifier لتحديد ان نوع البيانات المستخدم هو رقم و الأنواع الرقميه هى short و long و long long.

جزاك الله خيرا يا أخي على المعلومه.

#5

الأخوه هويدى و خالد، راجعوا ردى السابق فقد كان يحتوى على معلومه خاطئه و تم إصلاحها

اقتباس
ما هو المترجم GCC و ما علاقته بـ DEV ؟

Dev هو محرر و GCC هو مجموعة مترجمات مفتوحة المصدر و احدها هو مترجم للغة الـ C++

اقتباس
سمعتُ البعض يقول أن حجم int يعتمد على طبيعة نظام التشغيل ...! فيكون مثل short في أنظمة 16 بايت أما في أنظمة 32 بايت فيكون مثل long ! ما رأيك ؟

نعم هذا صحيح، حجم النوع int مجردا يساوى حجم المسجل داخل البروسسور، ففى الأنظمة 16 بت يكون حجمه 2 بايت و فى الأنظمة 32 بت يكون حجمه 4 بايت و فى الأنظمه 64 بت يكون حجمه 8 بايت. مع العلم أن هذا لا يؤثر على المساحة التى يستهلكها النوع عند استخدامه مع Length Modifier حيث حينها يوجد مدى معين من الأرقام لابد و أن يستطيع النوع أن يمثلها لذا حجم النوع int بإستخدام الـ Length Modifier ثابت بما يوجد فى الملف limits.h اما هو وحده دون Length Modifier فيعتمد على حجم مسجل البروسسور كما ذكرت من قبل.

اقتباس
لماذا يختلف المترجمات في تعيين حجم long double ؟

داخل الـ Standard الخاص باللغه الجزء [basic.fundamental] النقطه الثامنه تجد :

اقتباس

There are three floating point types: float, double, and long double. The type double provides at least as much

precision as float, and the type long double provides at least as much precision as double. The set of values of the

type float is a subset of the set of values of the type double; the set of values of the type double is a subset of the set of values of the type long double. The value representation of floating-point types is implementation-defined. Integral and floating types are collectively called arithmetic types. Specializations of the standard template std::numeric_limits (18.2) shall specify the maximum and minimum values of each arithmetic type for an implementation.

و الله ولى التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 2 يوليو 2010 في 08:47

1

مدونتي: C++ Tips and Tricks

#6

+1 على الشرح المميز :)

اقتباس
نعم هذا صحيح، حجم النوع int مجردا يساوى حجم المسجل داخل البروسسور، ففى الأنظمة 16 بت يكون حجمه 2 بايت و فى الأنظمة 32 بت يكون حجمه 4 بايت و فى الأنظمه 64 بت يكون حجمه 8 بايت مع العلم أن هذا لا يؤثر على المساحة التى يستهلكها النوع عند استخدامه مع Length Modifier حيث حينها يوجد مدى معين من الأرقام لابد و أن يستطيع النوع أن يمثلها لذا حجم النوع int بإستخدام الـ Length Modifier ثابت بما يوجد فى الملف limits.h اما هو وحده دون Length Modifier فيعتمد على حجم مسجل البروسسور كما ذكرت من قبل.

ما فهمت ! :blush: أرجوا التوضيح أكثر .. خصوصا الفقرات ذات اللون الأحمر.

ماذا تقصد بـ Length Modifier ؟

اقتباس

There are three floating point types: float, double, and long double. The type double provides at least as much

precision as float, and the type long double provides at least as much precision as double. The set of values of the

type float is a subset of the set of values of the type double; the set of values of the type double is a subset of the set of values of the type long double. The value representation of floating-point types is implementation-defined. Integral and floating types are collectively called arithmetic types. Specializations of the standard template std::numeric_limits (18.2) shall specify the maximum and minimum values of each arithmetic type for an implementation.

للأسف نحن ندرس باللغة الفرنسية و لا أعرف اللغة الإنجليزية :blush: فياريت توضح المطلوب بالعربية أو الفرنسية إذا أمكن.

تم تعديل هذه المشاركة بواسطة khaled_prg في 2 يوليو 2010 في 13:51

#7

لنبدأ من البدايه:

اللغه تحتوى على نوع واحد int و المساحه التى يمثلها فى الذاكره تتناسب مع الحاسب الذى تعمل عليه، فإذا كنت تعمل على جهاز 16بت (مثل الدوس) فالنوع int سيكون مساحته 2 بايت و إذا كنت تعمل على جهاز 32بت (مثل ويندوز 2000) فستجد ان مساحته هى 4 بايت أما إذا كنت تعمل على جهاز 64بت (مثل ويندوز 7 - x64) فستجد أن مساحته 8 بايت.

المقصود بكلمة مجردا المكتوبه بمشاركتى السابقه هو استخدام الكلمه int او signed int او unsigned int بهذا الشكل لتعريف متغير، فمثلا قم بتجربة الكود التالى :

#include <iostream>
using namespace std;

int main()
{
    if (sizeof(int) == 2)
        cout << "نظام التشغيل الذى تعمل عليه هو 16بت" << endl;
    else if (sizeof(int) == 4)
        cout << "نظام التشغيل الذى تعمل عليه هو 32بت" << endl;
    else if (sizeof(int) == 8)
        cout << "نظام التشغيل الذى تعمل عليه هو 64بت" << endl;
    else
        cout << "نظام التشغيل الذى تعمل عليه غريب من نوعه" << endl;
}

اقتباس
ماذا تقصد بـ Length Modifier ؟

كما رأينا بالأعلى أن النوع int مساحته متغيره، فالنفترض انك تريد استخدم متغير رقمى بمساحة 4 بايت حينها إذا عمل برنامجك على نظام تشغيل 16 بت و انت تستخدم النوع int فسيكون مساحته 2 بايت و هذا قد يجعل برنامجك يفشل فى تطبيق م يريد فهو يتوقع ان النوع int مساحته 4 بايت و قد ظهر ان مساحته هى 2 بايت فما الحل؟

الحل هنا يكمن فى استخدام طريقه تسمح لك بتحديد المساحه التى يستهلكها النوع int من الذاكره او بمعنى ادق مدى الأرقام الذى يمكن تمثيله بالنوع int و ذلك سواء كنت تعمل على نظام تشغيل 16بت او 32بت او 64بت او غيرهم تكون المساحه التى يستخدمها برنامجك واحده فى كل الأحوال. هذه الطريقه هى بإستخدام ما يسمى Length Modifier او "بمحددات المساحه - هذه ترجمه حرفيه اعذرونى عليها فأنا أعرف معنى الكلمه و لا اعرف لها ترجمه :blush: ".

الـ Length Modifier هى كلمات محجوزه باللغه بإستخدامها مع النوع int تجعل مدى الأرقام الذى يمكن تمثيله به ثابت لا يتغير من نظام تشغيل إلى أخر - أو بمعنى أدق من Architecture لأخرى - و بذلك تكون وصلت إلى ما تريد، الـ Length Modifier هى :

[signed] short
[signed] long
[signed] long long
unsigned short
unsigned long
unsigned long long

مع الـ Modifiers السابقه كتابة النوع int اختيارى حيث إذا لم تقم بكتابتها سيفهم المترجم انك تقصدها مع النوع int، ايضا الكلمه signed هى اختياريه و عدم كتابتها يعنى ان الرقم سيستخدم بإشارة.

عند استخدامك لـ short فأنت تحدد مساحة النوع int بمدى الأرقام التى يمكن تمثيلها فى 2 بايت، أيضا عند استخدامك لـ long فأنت تحدد مساحة النوع int بمدى الأرقام التى يمكن تمثيلها فى 4 بايت و بالمثل مع النوع long long فهو يحدد مساحة النوع int بمدى الأرقام التى يمكن تمثيلها فى 8 بايت.

اقتباس
ياريت توضح المطلوب بالعربية أو الفرنسية إذا أمكن
اقتباس
توجد 3 أنواع بيانات للأرقام العشريه و هى : float و double و long double، اما النوع double فلابد أن تكون دقته العشريه اكبر من او تساوى float، أيضا النوع long double لابد أن تكون دقته العشريه اكبر من او تساوى double. جميع القيم التى يمكن تمثيلها بالنوع float هى جزء من مجموعة القيم التى يمكن تمثيلها بالنوع double، كذلك جميع القيم التى يمكن تمثيلها بالنوع double هى جزء من مجموعة القيم التى يمكن تمثيلها بالنوع long double. ترميز الأرقام العشريه عامة ترجع إلى المترجم. أنواع الأرقام الصحيحه و العشريه جميعها يطلق عليها إسم الأنواع الحسابيه. لكل مترجم لابد من الفئه std::numeric_limits أن تحدد أقل و اكبر قيمه لكل نوع حسابى

و الله ولى التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 2 يوليو 2010 في 17:03

2

مدونتي: C++ Tips and Tricks

#8

+1 على الشرح المتعوب عليه .. لن أنساك بالدعاء بظهر الغيب :wub:

اقتباس
اللغه تحتوى على نوع واحد int و المساحه التى يمثلها فى الذاكره تتناسب مع الحاسب الذى تعمل عليه، فإذا كنت تعمل على جهاز 16بت (مثل الدوس) فالنوع int سيكون مساحته 2 بايت و إذا كنت تعمل على جهاز 32بت (مثل ويندوز 2000) فستجد ان مساحته هى 4 بايت أما إذا كنت تعمل على جهاز 64بت (مثل ويندوز 7 - x64) فستجد أن مساحته 8 بايت.

طيب إذا كان حجم int يتغير بتغير نظام التشغيل لماذا يتغير عند الديف و البورلاند مع أنني نفذت الكود على نفس نظام التشغيل !؟

أنت الآن تقول أن حجم int يعتمد على نوعية نظام التشغيل و قد قلتَ سابقا أن حجم int يعتمد على الإعدادات الإفتراضية للمترجم:

اقتباس
عندما تستخدم int فإن المترجم اما يقوم بإستخدام short او long و ذلك يعتمد على اعداداته الإفتراضيه و فى حالتك فالأول اعتمد ان int هو short و الأخير اعتمد أن int هو long.

ألا يوجد بعض التناقض بين القولين !؟

اقتباس
الحل هنا يكمن فى استخدام طريقه تسمح لك بتحديد المساحه التى يستهلكها النوع int من الذاكره او بمعنى ادق مدى الأرقام الذى يمكن تمثيله بالنوع int و ذلك سواء كنت تعمل على نظام تشغيل 16بت او 32بت او 64بت او غيرهم تكون المساحه التى يستخدمها برنامجك واحده فى كل الأحوال. هذه الطريقه هى بإستخدام ما يسمى Length Modifier

و هل يُمَكننا استخدام إحدى الكلمتين signed أو unsigned من تحديد المساحه التى يستهلكها النوع int !؟ لا أظن ذلك ...!

كنت أظطن أن الكلمة unsigned تتعلق باستعمال الأعداد الموجبة فإذا كان حجم int يساوي 2 بايت أي أن قيمته العظمى هي 32767 و قيمته الصغرى هي -32768 فإن قيمة unsigned int العظمى ستكون 65534 و قيمته الصغرى ستكون 0 أما إذا كان جحم int يساوي 4 بايت فستتغير القيمة العظمى و الصغرى لـ unsigned int مما يعني هذه الكلمة لا يمكنها تحديد المساحه التى يستهلكها النوع int إذْ تتغير بتغير مساحة int !

ما هي القيمة العظمى و الصغرى لـ long double ؟

#9
اقتباس

طيب إذا كان حجم int يتغير بتغير نظام التشغيل لماذا يتغير عند الديف و البورلاند مع أنني نفذت الكود على نفس نظام التشغيل !؟

أنا لم أقل ان حجم المتغير int يتغير بتغير نظام التشغيل و لكنى قلت فى اول مره أن حجم int مجردا يتساوى مع حجم المسجل داخل البروسسور و فى المره الأخرى قلت انه يتناسب مع الحاسب الذى تعمل عليه.

اقتباس
أنت الآن تقول أن حجم int يعتمد على نوعية نظام التشغيل و قد قلتَ سابقا أن حجم int يعتمد على الإعدادات الإفتراضية للمترجم

لا يوجد أى تعارض مع الجملتين و لكنك تحتاج ترتيب أولوية قرأتهم. الجهاز هو 32 بت لذا النوع int بشكل أفتراضى سيحجز مساحة 4 بايت، بعدها اللغه تركت لصانع المترجم الحريه فى ان يحدد إذا ما كان سيجعل مساحة int الإفتراضيه هى - فى هذه الحاله - 4 بايت ام سيجعلها غير ذلك، مترجم مايكروسوفت و كذلك مترجم intel على الأجهزة 32بت جعلوها 4 بايت و لا ادرى ما حال الأجهزه بالأخرى (16بت و 64بت)، وهذه النقطه ذكرت ضمنيا كمثال داخل الجزء [intro.execution] البند 1.9 الفقره 2 كالتالى:

اقتباس

Certain aspects and operations of the abstract machine are described in this International Standard as implementation defined (for example, sizeof(int)). These constitute the parameters of the abstract machine. Each implementation shall include documentation describing its characteristics and behavior in these respects. Such documentation shall define the instance of the abstract machine that corresponds to that implementation (referred to as the “corresponding instance” below)

اقتباس

بعض العمليات التى يقوم بها المترجم و التى تم وصفها هنا فى هذا التوثيق تتبع تضمين المترجم، على سبيل المثال sizeof(int)، مثل هذه العمليات تؤول للمترجم. من المفترض أن يوجد شرح لخصائص و سلوك هذه العمليات داخل وثائق المترجم ....

ترجمت فقط الجزء الذى احتاج ان اريك اياه.

اقتباس
و هل يُمَكننا استخدام إحدى الكلمتين signed أو unsigned من تحديد المساحه التى يستهلكها النوع int !؟ لا أظن ذلك ...!
اقتباس

الحل هنا يكمن فى استخدام طريقه تسمح لك بتحديد المساحه التى يستهلكها النوع int من الذاكره او بمعنى ادق مدى الأرقام الذى يمكن تمثيله بالنوع int و ذلك سواء كنت تعمل على نظام تشغيل 16بت او 32بت او 64بت او غيرهم تكون المساحه التى يستخدمها برنامجك واحده فى كل الأحوال. هذه الطريقه هى بإستخدام ما يسمى Length Modifier

هاتين الكلمتين هما جزء من الـ Modifier لتحديد مدى الأرقام. سأعود و اقول مره اخرى اللغه لا تهتم بالمساحه الذى يستهكلها النوع int من الذاكره و انما ما يهمها هو مدى الأرقام الذى يمكن تمثيله داخل هذا النوع و ذلك لإنه بإختلاف العتاد تختلف المعايير المتعلقه بحجز الذاكره و تحديد المساحات لذا و حتى تصبح اللغه مستقله عن العتاد لابد من تحديد أسس معينه يتم العمل بها و هى فى هذه الحالة مدى الأرقام و ليس المساحه المستهلكه من الذاكره.

إذا قمت بالنظر داخل الملف limits.h و الفئه numeric_limits ستجد انه يعطيك المدى المسموح به من الأرقام لنوع معين و هذا هو ما تشترطه اللغه اما المساحه التى يحجزها من الذاكره لتمثيل ذلك المدى فهى تعود للمترجم و يمكن ان تختلف من احدهم لأخر.

اقتباس
ما هي القيمة العظمى و الصغرى لـ long double ؟

القيمه الصغرى و الصغرى لهذا النوع هى على اقل تقدير تساوى القيمه العظمى و الصغرى للنوع double.

الخلاصه:

  • النوع int مساحته كنوع مجرد يتم تحديدها بناءا على العتاد نفسه و يسمح لصانع المترجم ان يقوم بتغييرها بما يترأى لتصميمه.
  • اللغه لا تهتم بالمساحه الذى يحجزها نوع افتراضى من الذاكره بقدر اهتمامها بمدى الأرقام الذى يمكن تمثيله بهذا النوع.
  • الـ Length Modifier تستخدم لتقليل او زيادة مدى الأرقام التى يمكن تمثيلها على الأنواع الرقميه الصحيحه.
  • مدى الأرقام الخاص بالنوع long double لابد ان يكون اكبر من او يساوى مدى الأرقام الذى يمكن تمثيله للنوع double

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 3 يوليو 2010 في 01:03

مدونتي: C++ Tips and Tricks

#10
اقتباس
الجهاز هو 32 بت لذا النوع int بشكل أفتراضى سيحجز مساحة 4 بايت بعدها اللغه تركت لصانع المترجم الحريه فى ان يحدد إذا ما كان سيجعل مساحة int الإفتراضيه هى - فى هذه الحاله - 4 بايت ام سيجعلها غير ذلك

و هل هذا يتعلق يالـ int فقط أم أنه ينطبق على باقي الأنواع !؟

اقتباس
اللغه لا تهتم بالمساحه الذى يستهكلها النوع int من الذاكره و انما ما يهمها هو مدى الأرقام الذى يمكن تمثيله داخل هذا النوع

أليس هنالك ارتباط وثيق ما بين مدى الأرقام و المساحة المستهلكة !؟

أشكرك على التوضيح :) و لقد استفدت كثيرا من هذا النقاش الجميل و بانتظار إجابة باقي الأسئلة.

#11
اقتباس
و هل هذا يتعلق يالـ int فقط أم أنه ينطبق على باقي الأنواع !؟

أى انواع تقصد؟

اقتباس
أليس هنالك ارتباط وثيق ما بين مدى الأرقام و المساحة المستهلكة !؟

لا ليس بالضروره، حيث تعتمد على ترميز الأرقام بالذاكره.

و الله ولى التوفيق

مدونتي: C++ Tips and Tricks

#12
اقتباس
أى انواع تقصد؟

short,long,float,double,long double

اقتباس
لا ليس بالضروره، حيث تعتمد على ترميز الأرقام بالذاكره.

لم أفهم ! :blush:

مثلا .. إذا علمنا أن القيمة العظمى لـ int هي 32767 و القيمة الصغرى له هي 32768- ألا يمكننا القول الآن أن مساحة int هي 2 بايت !؟

كنت أظن أنه بمعرفة مدى الأرقام يمكننا استنتاج المساحة المستهلكة ...!

#13
محمد علاء الدين كتب:

الجهاز هو 32 بت لذا النوع int بشكل أفتراضى سيحجز مساحة 4 بايت بعدها اللغه تركت لصانع المترجم الحريه فى ان يحدد إذا ما كان سيجعل مساحة int الإفتراضيه هى - فى هذه الحاله - 4 بايت ام سيجعلها غير ذلك

khaled_prg كتب:

و هل هذا يتعلق يالـ int فقط أم أنه ينطبق على باقي الأنواع !؟

محمد علاء الدين كتب:

أى انواع تقصد؟

khaled_prg كتب:

short,long,float,double,long double

كما قلت لك من قبل انسى أمر المساحات فهى ليست من ثوابت اللغه و لكن مدى الأرقام لذا قد يأتى مترجمت يوما ما و يحفظ مدى الأرقام الخاص بـ short داخل 20 بايت، المهم هو امكانية استخدام مدى الأرقام الذى تحدده اللغه أيا كان الترميز المستخدم داخل الذاكره.

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

اقتباس
مثلا .. إذا علمنا أن القيمة العظمى لـ int هي 32767 و القيمة الصغرى له هي 32768- ألا يمكننا القول الآن أن مساحة int هي 2 بايت !؟

فى الوضع الطبيعى نعم لإن جميع المترجمات تتبع نفس الأسلوب و لكنه ليس لزاما، فمثلا النوع unsigned char يستطيع ترميز الأرقام من 0 و حتى 255 و يستهلك 1 بايت لإن كل بت يمكنه تمثيل رقمين و لكنى قد اقرر انه داخل المترجم الخاص بى كل بت يمثل رقم واحد فقط لذا سأحتاج إلى 256 بت لترميز مدى الأرقام السابق ذكره و هذا يعنى انى احتاج 32 بايت.

أرجو ان تكون الفكره قد وضحت.

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#14
اقتباس
أرجو ان تكون الفكره قد وضحت.

يبدوا أن الأمر معقد بعض الشيء ! أو أن مستواي الشخصي لا يكفي لفهم هذه الأمور :blush:

#15

السلام عليكم

عودا على بدء .. وجدت بعض الإستشكالات في هذا الموضوع و أردت طرحها من أجل أن أفهم الفكرة بشكل جيد :)

اقتباس
اللغه تحتوى على نوع واحد int

ماذا تقصد بنوع واحد !؟ ألا توجد انواع أخرى مثل bool و float و double و string ...!

اقتباس
الحل هنا يكمن فى استخدام طريقه تسمح لك بتحديد المساحه التى يستهلكها النوع int من الذاكره او بمعنى ادق مدى الأرقام الذى يمكن تمثيله بالنوع int و ذلك سواء كنت تعمل على نظام تشغيل 16بت او 32بت او 64بت او غيرهم تكون المساحه التى يستخدمها برنامجك واحده فى كل الأحوال. هذه الطريقه هى بإستخدام ما يسمى Length Modifier او "بمحددات المساحه

هل أفهم من كلامك أن int هو أصل الأنواع الصحيحة و يمكننا تغيير المدى الخاص به لنحصل على أنواع جديدة مشتقة منه و هي short و long و long long كأن نكتب:

short int n;
long int n;
long lon int n;

بانتظار التوضيح.

#16
اقتباس

اللغه تحتوى على نوع واحد فقط int

انا لم اقل هذا و لكنى قلت:

اقتباس

يوجد نوع بيانات رقمى واحد فى اللغه هو int

إذا اردت دقة اكبر فى الألفاظ يمكنك استبدال نوع بيانات رقمى واحد بـ نوع بيانات واحد للأرقام الصحيحه

اقتباس
هل أفهم من كلامك أن int هو أصل الأنواع الصحيحة و يمكننا تغيير المدى الخاص به لنحصل على أنواع جديدة مشتقة منه و هي short و long و long long

نعم هذا صحيح

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#17

السلام عليكم

اقتباس
إذا اردت دقة اكبر فى الألفاظ يمكنك استبدال نوع بيانات رقمى واحد بـ نوع بيانات واحد للأرقام الصحيحه

ما شاء الله يا أستاذ علاء :wub: أحس أن القسم يكون في حالة جمود عندما تغيب عنه :wink:

لم يستطع أحد من الإخوة (الخبراء) الإجابة على أسئلتي :blush: مع أنني رأيتهم يتصفحون الموضوع :huh:

بصراحة يا أستاذ علاء .. أنت جوهر من جواهر الفريق العربي للبرمجة :wub:

الله يفتح عليك فتح العارفين بالله :)

دمت بألف خير.

تم تعديل هذه المشاركة بواسطة khaled_prg في 10 يوليو 2010 في 14:32

#18

السلام عليكم

مرة أخرى .. وجدت استشكالات في هذا الموضوع و أردت طرحها لأفهم أكثر :)

أنت قلت:

اقتباس
يوجد نوع بيانات رقمى واحد فى اللغه هو int و له عدة modifier يطلق عليها length modifier

-----------------------------

لا يوجد نوع اسمه int فهذا هو modifier لتحديد ان نوع البيانات المستخدم هو رقم و الأنواع الرقميه هى short و long و long long.

ألا يوجد تناقض ما بين القولين !؟

هل int من فئة الـ length modifier !؟

هل الكلمات التي تقع ضمن length modifier لا تُعتبر من أنواع المتغيرات !؟ إذن short و long و long long ليسوا أنواع متغبرات لأنهم من فئة length modifier !!!

------------------------------

أرجو التصحيح :) وشكرا.

#19

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

الجمله

اقتباس
لا يوجد نوع اسمه int فهذا هو modifier لتحديد ان نوع البيانات المستخدم هو رقم و الأنواع الرقميه هى short و long و long long.

موجوده بهذا الشكل فى المشاركه الثانيه لإنها خاطئه و التصحيح الخاص بها موجود اسفلها بالشكل التالى:

اقتباس
يوجد نوع بيانات رقمى واحد فى اللغه هو int و له عدة modifier يطلق عليها length modifier

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 30 يوليو 2010 في 15:19

1

مدونتي: C++ Tips and Tricks

#20

السلام عليكم

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

الجمله

اقتباس
لا يوجد نوع اسمه int فهذا هو modifier لتحديد ان نوع البيانات المستخدم هو رقم و الأنواع الرقميه هى short و long و long long.

موجوده بهذا الشكل فى المشاركه الثانيه لإنها خاطئه و التصحيح الخاص بها موجود اسفلها بالشكل التالى:

اقتباس
يوجد نوع بيانات رقمى واحد فى اللغه هو int و له عدة modifier يطلق عليها length modifier

أشكرك على سرعة الرد و انا آسف على عدم الإنتباه لتصحيح المعلومة :blush:

-------------------

هل أفهم من كلامك أن short و long و long long ليست انواع بيانات و إنما هي length modifier للنوع int !؟

جزاك الله ألف خير على المساعدة و أسأل الله سبحانه و تعالى أن يوفقك في الدارين و يزيدك من فضله إنه ولي ذلك و القادر عليه :)

تحياتي.

#21
اقتباس
هل أفهم من كلامك أن short و long و long long ليست انواع بيانات و إنما هي length modifier للنوع int !؟

هذا صحيح.

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#22

دمت فخرا للمنتدى :wub:

بالتوفيق :)

-----------------

يا ريت لو تساعدنا في هذا الموضوع:

كيفية إظهار الأعداد الضخمة باستخدام الدالة printf

تحياتي.

تم تعديل هذه المشاركة بواسطة khaled_prg في 30 يوليو 2010 في 16:29

#23

السلام عليكم

من جديد .. وجدت استشكالا في هذا الموضوع و أردت طرحه لأستفيد من خبراتكم البرمجية :wink:

-------------------

اقتباس
عندما تستخدم int فإن المترجم اما يقوم بإستخدام short او long و ذلك يعتمد على اعداداته الإفتراضيه و فى حالتك فالأول اعتمد ان int هو short و الأخير اعتمد أن int هو long.

إذا كان الحال هكذا فهل يمكننا تغيير إعدادات المترجم من أجل أن نضبط حجم int على short أو long و ذلك حسب رغبتنا !؟

تحياتي :)

#24
اقتباس
إذا كان الحال هكذا فهل يمكننا تغيير إعدادات المترجم من أجل أن نضبط حجم int على short أو long و ذلك حسب رغبتنا !؟

إقرأ في وثائق المترجم..

1
#25
اقتباس
إقرأ في وثائق المترجم..

+1

بالنسبه لمترجم VC و Intel لا يسمحا لك بتحديد حجم النوع int و يقوما بتحديده من تلقاء أنفسهم و لا اعلم حال باقى المترجمات.

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 5 أغسطس 2010 في 19:05

مدونتي: C++ Tips and Tricks

مواضيع مشابهة