نطاقات
المتغيرات
أفعال

ثابت عدد صحيح

من cppreference.com

لاستخدام الاعداد الصحيحة مباشرة في التعبيرات

التركيب

ثابت العدد الصحيح (سنسميه رقم صحيح فصاعدا) هو تعبير non-lvalue على النمط التالي:

decimal-constant integer-suffix(optional) (1)
octal-constant integer-suffix(optional) (2)
hex-constant integer-suffix(optional) (3)

حيث:

  • decimal-constant (رقم عشري) يتكون من رقم عشري دون الصفر (‎1‎ و‎2‎ و‎3‎ و‎4‎ و‎5‎ و‎6‎ و‎7‎ و‎8‎ و‎9‎) ثم صفر أو أكثر من الارقام العشرية (‎0‎ و‎1‎ و‎2‎ و‎3‎ و‎4‎ و‎5‎ و‎6‎ و‎7‎ و‎8‎ و‎9‎)
  • octal-constant (رقم ثماني) يتكون من الرقم صفر(‎0‎) ثم صفر أ وأكثر من الارقام الثمانية (‎0‎ و‎1‎ و‎2‎ و‎3‎ و‎4‎ و‎5‎ و‎6‎ و‎7‎)
  • hex-constant (رقم ست عشري) يتكون من الحروف 0x ثم وحدة أ وأكثر من الارقام الست عشرية (‎0‎ و‎1‎ و‎2‎ و‎3‎ و‎4‎ و‎5‎ و‎6‎ و‎7‎ و‎8‎ و‎9‎ و‎a‎ و‎A‎ و‎b‎ و‎B‎ و‎c‎ و‎C‎ و‎d‎ و‎D‎ و‎e‎ و‎E‎ و‎f‎ و‎F‎)


  • integer-suffix (ملحق للنوع) حال توفره يتكون من إحدى هذين الحرفين أو كليهم:
  • unsigned-suffix: الحرف ‎u‎ أو ‎U‎
  • long-suffix (الحرف ‎l‎ أو أو long-long-suffix(الحرفين ‎ll‎ أو ‎LL‎) (منذ C99)


الشرح

1) رقم عشري صحيح (base-10). أول خانة من اليسار هي الأكبر.
2) رقم ثماني صحيح (base-8). أول خانة من اليسار هي الأكبر.
3) رقم ست عشري صحيح (base-16). أو خانة من اليسار هي الأكبر. يتم إستخدام الحروف من 'a' حتى 'f' لتمثيل القيم من 10 إلى 15

مثال: المتغيرات التالية كلها تحوي نفس القيمة:

int d = 42;
int o = 052;
int x = 0x2a;
int X = 0X2A;

نوع الرقم الصحيح

نوع الرقم الصحيح هو أول نوع يسع القيمة من ضمن الأنواع في الجدول التالي. قائمة الأنواع تتوقف على النظام الرقمي المستخدم والملحق المحدد للنوع (integer-suffix) إن وجد:

الأنواع المسموح بها للأرقام الصحيحة
الملحق نظام عشري نظام ثماني أو ست عشري
بدون ملحق int

long int
unsigned long int (حتى C99)
long long int (منذ C99)

int

unsigned int
long int
unsigned long int
long long int(منذ C99)
unsigned long long int(منذ C99)

‎u‎ unsigned int

unsigned long int
unsigned long long int(منذ C99)

unsigned int

unsigned long int
unsigned long long int(منذ C99)

‎l‎ long int

unsigned long int(حتى C99)
long long int(منذ C99)

long int

unsigned long int
long long int(منذ C99)
unsigned long long int(منذ C99)

‎ul‎ unsigned long int

unsigned long long int(منذ C99)

unsigned long int

unsigned long long int(منذ C99)

‎ll‎ long long int(منذ C99) long long int(منذ C99)

unsigned long long int(منذ C99)

‎ull‎ unsigned long long int(منذ C99) unsigned long long int(منذ C99)

لو تعدت قيمة الرقم الصحيح سعة الأنواع حسب الجدول بالأعلى يجوز للكومبيلر أن يستخدم أعداد صحيحة أكبر ربما يدعمها بشكل غير معياري (مثل __int128). دون ذلك فالبرنامج شاذ.

ملحوظات

في الارقام الصحيحة لا يتم الإلتفات إلى كن الحرف Capital أو small: ‏ ‎0xDeAdBaBeU‎ و ‎0XdeadBABEu‎ تعبران عن نفس القيمة. الاستثناء الوحيد هو long-long-suffix، فهو إما ‎ll‎ أو ‎LL‎ وليس ‎lL‎ أو ‎Ll‎

لا يوجد ما يسمى برقم صحيح سالب. تعبيرات مثل ‎ -1 تنتج عن تطبيق المعامل unary minus operator على القيمة الممثلة وربما ينتج عن ذلك تحويلات ضمنية في النوع.

عند إستخدم الأرقام الصحيحة ضمن شروط المعالج القبلي (preprocessor)، أي ضمن #if أو #elif يتم إعتبار جميع الثوابت ذات إشارة كما لو كانت من النوع intmax_t‎ وجميع الثوابت دون إشارة كما لو كانت من النوع uintmax_t‎.

يجوز إستخدام الأرقام الصحيحة في integer constant expressions.

مثال

#include <stdio.h>

int main(void)
{
    printf("123 = %d\n", 123);
    printf("0123 = %d\n", 0123);
    printf("0x123 = %d\n", 0x123);
    printf("12345678901234567890ull = %llu\n", 12345678901234567890ull);
    // the type is unsigned long long even without a long long suffix
    printf("12345678901234567890u = %llu\n", 12345678901234567890u );

//  printf("%lld\n", -9223372036854775808); // ERROR
// the value 9223372036854775808 cannot fit in signed long long, which is the
// biggest type allowed for unsuffixed decimal integer constant

    printf("%llu\n", -9223372036854775808u );
    // unary minus applied to unsigned value subtracts it from 2^64,
    // this gives 9223372036854775808

    printf("%lld\n", -9223372036854775807 - 1);
    // // correct way to represent the value -9223372036854775808
}

الخرج:

123 = 123
0123 = 83
0x123 = 291
12345678901234567890ull = 12345678901234567890
12345678901234567890u = 12345678901234567890
9223372036854775808
-9223372036854775808

مراجع

  • معيار C11‏ (ISO/IEC 9899:2011):
  • 6.4.4.1 Integer constants (p: 62-64)
  • معيار C99 ‏ (ISO/IEC 9899:1999):
  • 6.4.4.1 Integer constants (p: 54-56)
  • معيار C89/C90 ‏(ISO/IEC 9899:1990):

أنظر أيضا

مقالة مرجع C++‎ عن ثابت عدد صحيح
Morty Proxy This is a proxified and sanitized view of the page, visit original site.