ما نوع البيانات الذي يجب استخدامه لأرقام كبيرة جدًا في C ++؟
-
02-10-2019 - |
سؤال
لا بد لي من تخزين الرقم 600851475143
في برنامجي. حاولت تخزينه في long long int
متغير و long double
كذلك ولكن عند تجميعه يظهر الخطأ
integer constant is too large for "long" type.
لقد حاولت أيضا unsigned long long int
جدا. أنا أستخدم Mingw 5.1.6 لتشغيل G ++ على Windows.
ما نوع البيانات الذي يجب أن أستخدمه لتخزين الرقم؟
المحلول
long long
على ما يرام ، ولكن عليك استخدام لاحقة على الحرفي.
long long x = 600851475143ll; // can use LL instead if you prefer.
إذا تركت ll
خارج نهاية الحرفي ، يفترض المترجم أنك تريد أن تكون int
, ، وهو في معظم الحالات هو رقم موقّع 32 بت. 32 بت ليست كافية لتخزين هذه القيمة الكبيرة ، وبالتالي التحذير. عن طريق إضافة ll
, ، أنت تشير إلى المترجم بأنه يجب تفسير الحرفي على أنه أ long long
, ، وهو كبير بما يكفي لتخزين القيمة.
اللاحقة مفيدة أيضًا لتحديد الحمل الزائد للاتصال بوظيفة ما. فمثلا:
void foo(long long x) {}
void foo(int x) {}
int main()
{
foo(0); // calls foo(int x)
foo(0LL); // calls foo(long long x)
}
نصائح أخرى
كان لديك الفكرة الصحيحة مع long long int
(أو unsigned long long int
) ، ولكن لمنع التحذير ، تحتاج إلى إخبار المترجم بأن الثابت هو أ long long int
:
long long int value = 600851475143LL;
يمكن أن تكون هذه "L" في حالة أقل ، لكنني أنصح ضدها-اعتمادًا على الخط ، غالبًا ما يشبه "L" الحالة السفلية إلى حد كبير مثل رقم واحد ("1") بدلاً من ذلك.
ألقِ نظرة على مكتبة GNU MP Bignum http://gmplib.org/