الأعداد الصحيحة في PHP

من موسوعة حسوب
< PHP
اذهب إلى التنقل اذهب إلى البحث

العدد الصحيح هو عدد من المجموعة ℤ = {…, -2, -1, 0, 1, 2, …}‎‎.

البنية العامة

يمكن تحديد الأعداد الصحيحة باستخدام النظام العشري (decimal، أي ذو الأساس 10) والست عشري (hexadecimal، الأساس 16) والثماني (octal، الأساس 8) والثنائي (binary، الأساس 2)، كما يمكن أن يسبقها (اختياريًا) إشارة - أو +.

أصبحت الأعداد الثنائية موجودة منذ الإصدار PHP 5.4.0. 

يجب أن يسبق العدد بالقيمة 0 لاستخدام النظام الثماني، وبالقيمة 0x لاستخدام النظام الست عشري، أما النظام الثنائي فيجب وضع 0b قبل العدد. 

المثال الأول: الأعداد الصحيحة

<?php
$a = 1234; // عدد في النظام العشري
$a = -123; // عدد سالب
$a = 0123; // عدد في النظام الثماني، يكافئ 83 في النظام العشري
$a = 0x1A; // عدد في النظام الست عشري، يكافئ 26 في النظام العشري
$a = 0b11111111; // عدد في النظام الثنائي، يكافئ 255 في النظام العشري
?>

هذه هي البنية الرسمية للأعداد الصحيحة:

: [1-9][0-9]*

| 0

decimal
: 0[xX][0-9a-fA-F]+ hexadecimal
: 0[0-7]+ octal
: 0b[01]+ binary
: [+-]?decimal

| [+-]?hexadecimal

| [+-]?octal

| [+-]?binary

integer

تختلف قيمة العدد الصحيح حسب المنصة، حيث تبلغ أقصى قيمة حوالي 2 مليار (على منصات 32 بت مع استخدام إشارة [sgined]) أما منصات 64 بت فهي تملك في العادة حوال 9E18، باستثناء نظام ويندوز في الإصدارات قبل PHP 7 حيث تكون 32 بت دومًا. 

لا تدعم PHP الأعداد الصحيحة دون إشارة (unsigned)، ويمكن تحديد حجم العدد الصحيح باستخدام الثابت PHP_INT_SIZE، ويمكنك معرفة أقصى قيمة باستخدام PHP_INT_MAX بدءًا من الإصدار PHP 5.0.5، وأدنى قيمة باستخدام الثابت PHP_INT_MIN بدءًا من الإصدار PHP 7.0.0 .

تنبيه: قبل PHP7، إذا أُعطِي عددٌ غير صالحٍ إلى عددٍ صحيحٍ في نظام العد الثماني (على سبيل المثال: 9)، فسيتم تجاهل بقية الرقم، أما في الإصدار 7 وما بعده، فستظهر رسالة خطأ (parse error).

تجاوز العدد الصحيح الحد الأقصى

ستتعامل PHP مع العدد الصحيح إذا كان أكبر من الحد الأقصى (أي حدث overflow) كأنه عدد عشري (float)، وستُعيد العمليات التي تجرى على الأعداد الصحيحة التي تتجاوز الحد الأقصى على أنها من النوع float أيضًا.

المثال الثاني: تجاوز العدد الصحيح للحد الأقصى على نظام 32 بت 

<?php
$large_number = 2147483647;
var_dump($large_number);                     // int(2147483647)

$large_number = 2147483648;
var_dump($large_number);                     // float(2147483648)

$million = 1000000;
$large_number =  50000 * $million;
var_dump($large_number);                     // float(50000000000)
?>

المثال الثالث: تجاوز العدد الصحيح للحد الأقصى على نظام 64 بت

<?php
$large_number = 9223372036854775807;
var_dump($large_number);                     // int(9223372036854775807)

$large_number = 9223372036854775808;
var_dump($large_number);                     // float(9.2233720368548E+18)

$million = 1000000;
$large_number =  50000000000000 * $million;
var_dump($large_number);                     // float(5.0E+19)
?>

ليس هنالك معامل لقسمة عدد صحيح في PHP، فالقيمة ½ تساوي 0.5، يمكنك تحويل (cast) النتيجة السابقة إلى عدد صحيح ليتم تقريبها وتصبح صفرًا، أو يمكنك استخدام دالة round()‎ التي توفر تحكمًا دقيقًا في موضوع التقريب.

<?php
var_dump(25/7);         // float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7));  // float(4)
?>

التحويل إلى عدد صحيح

لتحويل قيمة إلى عدد صحيح، يمكنك استخدام الجبائر (cast) عبر (int) أو (integer)، وعلى أي حال، لن تحتاج في أغلب الحالات إلى هذه العملية، إذ ستُحوَّل القيمة إذا كان المعامل أو الدالة أو بنية التحكم تتطلب معاملًا من نوع integer، ويمكن أيضًا تحويل قيمةٍ ما إلى عددٍ صحيحٍ باستخدام الدالة intval()‎.

إذا تم تحويل مورد resource إلى عدد صحيح، فستكون النتيجة مُعرِّف مورد فريد يتم تعيينه إلى المورد بواسطة PHP وقت التشغيل.

اطلع أيضا على صفحة التعامل مع الأنواع (Type Juggling) لمزيدٍ من التفاصيل.

من القيم المنطقية

القيمة FALSE ستكون صفرًا 0 والقيمة TRUE ستكون 1.

من عدد عشري

عند التحويل من عدد عشري إلى عدد صحيح، سيُقرَّب العدد قبل الفاصلة إلى 0. 

إذا كان العدد الكسري أكبر من الحد الأقصى للأعداد الصحيحة (وهو في العادة ‎+/- 2.15e+9 = 2^31 على بيئة 32 بت و ‎+/- 9.22e+18 = 2^63 على بيئة 64 بت على جميع المنصات عدا ويندوز)، فإن النتيجة غير معروفة (undefined) لأنَّ العدد العشري ليس دقيقًا كفايةً لإعطائك نتيجة مضبوطة، ولن يُظهَر تحذيرٌ (warning) أو تنبيهٌ (notice) عند حدوث هذه المشكلة.

ملاحظة: بدءًا من PHP 7.0.0، أصبحت القيم NaN و Infinity مساوية لصفر عند تحويلها إلى عدد صحيح، بعد أن كانت غير معروفة (undefined) وتعتمد على المنصة.

تحذير: لا تحاول تحويل (cast) عملية تتضمن عددًا عشريًا غير معروفٍ إلى عدد صحيح، لأن هذا قد يؤدي بعض الأحيان إلى نتائج غير متوقعة.

<?php
echo (int) ( (0.1+0.7) * 10 ); // echoes 7!
?>

اطلع على تحذير حول تقريب الأعداد العشرية في صفحة نوع البيانات float.

من سلاسل نصية

اطلع على قسم تحويل السلاسل النصية إلى أعداد.

من أنواع أخرى

تحذير: نتيجة تحويل الأنواع الأخرى إلى عدد صحيح غير معروفة، لذلك لا تعتمد على أي سلوك ملحوظ، فيمكن أن يتغير دون إشعار.

مصادر