Цілим (integer) називають число, що належить множині ℤ = {..., -2, -1, 0, 1, 2, ...}.
Цілі числа (int) можна вказувати в десятковій (основа 10), шістнадцятковій (основа 16), вісімковій (основа 8) або двійковій (основа 2) формах запису. Мінус-оператором можна позначити від'ємне ціле число (int).
Для вісімкової форми запису перед числом ставиться 0
(нуль).
Починаючи з PHP 8.1.0, вісімковій формі запису може передувати
0o
або 0O
.
Для шістнадцяткової форми запису перед числом ставиться 0x
(нуль та латинська x).
Для двійкової форми запису перед числом ставиться 0b
(нуль та b).
Починаючи з PHP 7.4.0, для кращої розбірливості цілі числа можуть містити
знаки підкреслення (_
) між цифрами. Потім парсер PHP
вилучає ці підкреслення.
Приклад #1 Запис цілого числа
<?php
$a = 1234; // десяткове число
$a = 1_234_567; // десяткове число (починаючи з PHP 7.4.0)
$a = -123; // від'ємне десяткове число
$a = 0123; // вісімкове число (дорівнює десятковому 83)
a = 0o123; // вісімкове число (починаючи з PHP 8.1.0)
$a = 0x1A; // шістнадцяткове число (дорівнює десятковому 26)
$a = 0b11111111; // двійкове число (дорівнює десятковому 255)
?>
Формально, починаючи з PHP 8.1.0, структура цілого числа (int) є
такою (раніше вісімкові префікси 0o
та
0O
не були дозволені, а до PHP 7.4.0 не були дозволені
символи підкреслення):
десяткове : [1-9][0-9]*(_[0-9]+)* | 0 шістнадцяткове : 0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)* вісімкове : 0[oO]?[0-7]+(_[0-7]+)* двійкове : 0[bB][01]+(_[01]+)* ціле : десяткове | шістнадцяткове | вісімкове | двійкове
Розмір цілого числа (int) залежить від платформи, хоча, зазвичай,
максимальне значення близьке до двох мільярдів (це 32-бітне знакове).
64-бітні платформи зазвичай мають максимальне значення близьке до 9E18.
PHP не підтримує беззнакові цілі числа. Розмір цілого числа містить константа
PHP_INT_SIZE
, максимальне значення — константа
PHP_INT_MAX
та мінімальне значення — константа
PHP_INT_MIN
.
Якщо PHP стикається з числом, що виходить за межі типу int, то інтерпретує його як десятковий дріб (float). Відповідно, в операціях з результатом за межами типу int буде повертатись десятковий дріб (float).
Приклад #2 Переповнення цілого числа
<?php
$велике_число = 50000000000000000000;
var_dump($велике_число); // float(5.0E+19)
var_dump(PHP_INT_MAX + 1); // у 32-бітних системах: float(2147483648)
// у 64-бітних системах: float(9.2233720368548E+18)
?>
В PHP не існує оператора для ділення цілих чисел (int). Для
цього застосовується функція intdiv().
Дія 1/2
в результаті поверне десятковий дріб
(float) 0.5
. Таке значення можна привести до
цілочисельного (int) типу з округленням в бік нуля. Натомість
регулювати округлення можна функцією round().
<?php
var_dump(25/7); // float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7)); // float(4)
?>
Щоб явно перетворити значення на ціле число (int),
застосовується приведення за допомогою запису (int)
або
(integer)
. Здебільшого приведення не потрібне, оскільки
значення буде автоматично перетворено, якщо оператор, функція чи структура
контролю очікують значення типу int. Також тип значення можна
перетворити на int функцією intval().
Результатом перетворення типу resource на int є унікальне число, яке призначається для ресурсу (resource) під час виконання програми.
Дивіться також: Перетворення типів.
false
буде перетворено на 0
(нуль), а true
—
на 1
(одиницю).
Під час перетворення float на int відбувається округлення в бік нуля. Починаючи з PHP 8.1.0, у відповідь на перетворення float з ненульовою дробовою частиною на int, що призводить до втрати точності, виводиться повідомлення про застарілий функціонал.
<?php
function foo($value): int {
return $value;
}
var_dump(foo(8.1)); // "Deprecated: Implicit conversion from float 8.1 to int loses precision", починаючи з PHP 8.1.0
var_dump(foo(8.1)); // 8 до PHP 8.1.0
var_dump(foo(8.0)); // 8 у обох випадках
var_dump((int) 8.1); // 8 у обох випадках
var_dump(intval(8.1)); // 8 у обох випадках
?>
Якщо десятковий дріб вийде за межі типу int (зазвичай це
+/- 2.15e+9 = 2^31
на 32-бітних платформах та
+/- 9.22e+18 = 2^63
на 64-бітних платформах), результат
буде невизначеним, оскільки тип float не має достатньої
точності, щоб дати саме цілочисельний результат. Інтерпретатор про це не
повідомляє!
Зауваження:
Результатом приведення спеціальних чисел
NaN
,Inf
та-Inf
до типу int є число нуль (0
).
Не можна перетворювати невідомий дріб на ціле число, оскільки це може призвести до непередбачуваного результату.
<?php
echo (int) ( (0.1+0.7) * 10 ); // виводить 7!
?>
Варто переглянути застереження про точність десяткового дробу.
Якщо рядок є
числовим або
починається з числа, то його можна перетворити на відповідне цілочисельне
значення, а інакше — на нуль (0
).
Результат перетворення інших типів на int є невизначеним. НЕ можна покладатись на такі перетворення, оскільки їхній алгоритм може змінюватись без попереджень.