ما نطاق القيم التي يمكن للأنواع الصحيحة تخزينها في C++
سؤال
يستطيع unsigned long int
هل تحمل رقمًا مكونًا من عشرة أرقام (1,000,000,000 - 9,999,999,999) على جهاز كمبيوتر 32 بت؟
بالإضافة إلى ذلك، ما هي نطاقات unsigned long int
, long int
, unsigned int
, short int
, short unsigned int
, ، و int
?
المحلول
ال الحد الأدنى النطاقات التي يمكنك الاعتماد عليها هي:
short int
وint
:-32,767 إلى 32,767unsigned short int
وunsigned int
:0 إلى 65,535long int
:-2,147,483,647 إلى 2,147,483,647unsigned long int
:من 0 إلى 4,294,967,295
وهذا يعني أنه لا، long int
لا تستطيع يمكن الاعتماد عليه لتخزين أي رقم مكون من 10 أرقام.ومع ذلك، نوع أكبر long long int
تم تقديمه إلى C في C99 وC++ في C++ 11 (غالبًا ما يتم دعم هذا النوع أيضًا كملحق بواسطة المترجمين المصممين للمعايير القديمة التي لم تتضمنه).الحد الأدنى للنطاق لهذا النوع، إذا كان المترجم الخاص بك يدعمه، هو:
long long int
:-9,223,372,036,854,775,807 إلى 9,223,372,036,854,775,807unsigned long long int
:0 إلى 18,446,744,073,709,551,615
لذلك سيكون هذا النوع كبيرًا بما يكفي (مرة أخرى، لو متوفر لديك).
ملاحظة لأولئك الذين يعتقدون أنني ارتكبت خطأً فيما يتعلق بهذه الحدود الدنيا - لم أفعل ذلك.تتم كتابة متطلبات C للنطاقات للسماح بتمثيل الأعداد الصحيحة المكملة أو حجم الإشارة، حيث تختلف أقل قيمة قابلة للتمثيل وأعلى قيمة قابلة للتمثيل فقط في الإشارة.يُسمح أيضًا بالحصول على تمثيل مكمل ثنائي حيث تكون القيمة ذات بت الإشارة 1 وجميع بتات القيمة 0 عبارة عن تمثيل مصيدة بدلا من القيمة القانونية.بعبارة أخرى، int
يكون لا مطلوب لتكون قادرًا على تمثيل القيمة -32,768.
نصائح أخرى
لم يتم تحديد حجم الأنواع الرقمية في معيار C++، على الرغم من أن الحد الأدنى للأحجام محدد.طريقة معرفة حجمها على النظام الأساسي الخاص بك هي استخدامها الحدود الرقمية
على سبيل المثال، يمكن العثور على الحد الأقصى لقيمة int من خلال:
std::numeric_limits<int>::max();
أجهزة الكمبيوتر لا تعمل على الأساس 10، مما يعني أن القيمة القصوى ستكون على شكل 2ن-1 بسبب كيفية تمثيل الأرقام في الذاكرة.خذ على سبيل المثال ثمانية بتات (1 بايت)
0100 1000
أقصى بت (رقم) على اليمين عند التعيين على 1 يمثل 20, ، الجزء التالي 21, ، ثم 22 وهكذا حتى نصل إلى أقصى اليسار والذي إذا كان الرقم غير موقع يمثل 27.
وبالتالي فإن الرقم يمثل 26 + 23 = 64 + 8 = 72، لأنه تم ضبط البتة الرابعة من اليمين والسابعة من اليمين على اليسار.
إذا قمنا بتعيين جميع القيم على 1:
11111111
الرقم الآن (على افتراض غير موقعة)
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 = 28 - 1
وكما نرى، هذه هي أكبر قيمة ممكنة يمكن تمثيلها بـ 8 بتات.
على جهازي، كل من int وlong متماثلان، كل منهما قادر على الاحتفاظ بما بين -231 إلى 231 - 1.في تجربتي، الحجم الأكثر شيوعًا على أجهزة سطح المكتب الحديثة 32 بت.
لمعرفة القيود المفروضة على الخاصة بك م> النظام:
#include <iostream>
#include <limits>
int main(int, char **) {
std::cout
<< static_cast< int >(std::numeric_limits< char >::max()) << "\n"
<< static_cast< int >(std::numeric_limits< unsigned char >::max()) << "\n"
<< std::numeric_limits< short >::max() << "\n"
<< std::numeric_limits< unsigned short >::max() << "\n"
<< std::numeric_limits< int >::max() << "\n"
<< std::numeric_limits< unsigned int >::max() << "\n"
<< std::numeric_limits< long >::max() << "\n"
<< std::numeric_limits< unsigned long >::max() << "\n"
<< std::numeric_limits< long long >::max() << "\n"
<< std::numeric_limits< unsigned long long >::max() << "\n";
}
لاحظ أن long long
هو قانوني فقط في C99 وفي C ++ (11).
وغيرها من الناس هنا سيتم نشر روابط لdata_sizes وتوضيحات الخ
أنا ذاهب لاقول لكم كيفية معرفة ذلك بنفسك.
إرسال التطبيق صغير من شأنها أن تفعل ما يلي.
unsigned int ui;
std::cout << sizeof(ui));
وهذا سوف (اعتمادا على مترجم وarchicture) الطباعة 2 أو 4 أو 8، قائلا 2 بايت و 4 بايت الخ.
ونفترض انها 4.
وأنت تريد الآن أقصى قيمة يمكن 4 بايت تخزين، وقيمة الحد الأقصى للبايت واحد هو (في ست عشري) عشرية 0xFF. و0X أعقبت قيمة الحد الأقصى من وحدات البايت الأربع بنسبة 8 و في (زوج واحد من و لكل بايت، ب 0x يقول المترجم أن السلسلة التالية هي عدد عرافة). الآن تغيير البرنامج لتعيين هذه القيمة وطباعة النتيجة
unsigned int ui = 0xFFFFFFFF;
std::cout << ui;
وثت قيمة الحد الأقصى عدد صحيح غير موقعة يمكن أن تعقد، كما هو موضح في الأساس 10 التمثيل.
والآن يفعل ذلك كنت غريبة عن للفترة طويلة، والسراويل وأي قيمة عدد صحيح الأخرى.
ملحوظة: وهذا النهج لا تعمل لأرقام النقطة العائمة (أي ضعف أو تعويم)
.ويساعد هذا الأمل
في C ++، الآن كثافة العمليات ويتم تخزين بيانات أخرى باستخدام 2 في طريقة مجاملة. وهذا يعني أن النطاق:
-2147483648 to 2147483647
وأو -2 ^ 31-2 31-1 ^
محجوز1 بت ل0 قيمة إيجابية لذلك هو واحد أقل من 2 ^ (31)
ل نوع البيانات غير الموقعة لا يوجد بق البت وجميع البتات للبيانات ؛بينما ل نوع البيانات الموقعة يشار إلى بتة الإشارة MSB والبتات المتبقية مخصصة للبيانات.
للعثور على النطاق قم بالأشياء التالية:
الخطوة: 1 -> اكتشف عدم وجود بايتات لنوع بيانات العطاء.
الخطوة: 2 -> قم بتطبيق الحسابات التالية.
Let n = no of bits in data type
For signed data type ::
Lower Range = -(2^(n-1))
Upper Range = (2^(n-1)) - 1)
For unsigned data type ::
Lower Range = 0
Upper Range = (2^(n)) - 1
على سبيل المثال.
بالنسبة لحجم int غير الموقع = 4 بايت (32 بت) --> النطاق [0 , (2^(32)) - 1]
بالنسبة لحجم int الموقع = 4 بايت (32 بت) --> النطاق [-(2^(32-1)) , (2^(32-1)) - 1]
لا، إلا جزءا من عشرة رقم سيارة يمكن تخزينها في كثافة طويل غير موقعة الذين صالح مجموعة من 0 إلى 4،294،967،295. يمكنك الرجوع إلى هذا: http://msdn.microsoft.com/en-us /library/s3f49ktz(VS.80).aspx
هل كثافة طويل غير موقعة عقد عدد عشرة أرقام (1000000000 - 9999999999). على جهاز كمبيوتر 32 بت
اقتباس فقرة>لا
ويجب أن تبحث في تخصصات numeric_limits <> قالب لنوع معين. في الرأس.