ثابت عدد صحيح
لاستخدام الاعداد الصحيحة مباشرة في التعبيرات
التركيب
ثابت العدد الصحيح (سنسميه رقم صحيح فصاعدا) هو تعبير 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)
الشرح
مثال: المتغيرات التالية كلها تحوي نفس القيمة:
int d = 42;
int o = 052;
int x = 0x2a;
int X = 0X2A;
نوع الرقم الصحيح
نوع الرقم الصحيح هو أول نوع يسع القيمة من ضمن الأنواع في الجدول التالي. قائمة الأنواع تتوقف على النظام الرقمي المستخدم والملحق المحدد للنوع (integer-suffix) إن وجد:
| الأنواع المسموح بها للأرقام الصحيحة | ||
|---|---|---|
| الملحق | نظام عشري | نظام ثماني أو ست عشري |
| بدون ملحق | int
|
int
|
u
|
unsigned int
|
unsigned int
|
l
|
long int
|
long int
|
ul
|
unsigned long int
|
unsigned long int
|
ll
|
long long int(منذ C99)
|
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++ عن ثابت عدد صحيح
|