ما نطاق القيم التي يمكن للأنواع الصحيحة تخزينها في C++

StackOverflow https://stackoverflow.com/questions/1819189

  •  10-07-2019
  •  | 
  •  

سؤال

يستطيع 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,767
  • unsigned short int و unsigned int:0 إلى 65,535
  • long int:-2,147,483,647 إلى 2,147,483,647
  • unsigned 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,807
  • unsigned 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 <> قالب لنوع معين. في الرأس.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top