Integers

Оновлено: 11.05.2023

Int - це число з множини ℤ = {..., -2, -1, 0, 1, 2, ...}.

Числа з плаваючою комою Довільна точність / BCMath Ціле число довільної довжини / GMP

Інти можуть бути задані у десятковій (основа 10), шістнадцятковій (основа 16), вісімковій (основа 8) або двійковій (основа 2) системі числення. Для позначення від'ємного int можна використовувати оператор заперечення.

Щоб використовувати вісімкову систему числення, поставте перед числом 0 (нуль). Починаючи з версії PHP 8.1.0, вісімковій системі числення також можна додавати 0o або 0O. Для використання шістнадцяткової системи числення перед числом слід ставити 0x. Для використання двійкової системи числення перед числом слід поставити 0b.

Починаючи з версії PHP 7.4.0, цілочисельні літерали можуть містити підкреслення (_) між цифрами для кращої читабельності літералів. Ці підкреслення видаляються сканером PHP.

Приклад #1 Цілочисельні літерали

<?php
$a = 1234; // decimal number
$a = 0123; // octal number (equivalent to 83 decimal)
$a = 0o123; // octal number (as of PHP 8.1.0)
$a = 0x1A; // hexadecimal number (equivalent to 26 decimal)
$a = 0b11111111; // binary number (equivalent to 255 decimal)
$a = 1_234_567; // decimal number (as of PHP 7.4.0)
?>

Формально, структура літералів int відповідає версії PHP 8.1.0 (раніше не дозволялися вісімкові префікси 0o або 0O, а до версії PHP 7.4.0 не дозволялися символи підкреслення):

Розмір типу int залежить від платформи, хоча максимальне значення близько двох мільярдів є звичайним значенням (це 32 біти зі знаком). 64-розрядні платформи зазвичай мають максимальне значення близько 9E18. PHP не підтримує беззнакові типи int. Розмір int можна визначити за допомогою константи PHP_INT_SIZE, максимальне значення - за допомогою константи PHP_INT_MAX, а мінімальне - за допомогою константи PHP_INT_MIN.

Якщо PHP зустрічає число, що виходить за межі типу int, воно буде інтерпретоване як число з плаваючою комою. Також, операція, яка призводить до числа, що виходить за межі типу int, поверне замість нього число типу float.

Приклад #2 Переповнення цілого числа на 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)
?>

Приклад #3 Цілочисельне переповнення на 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 немає оператора ділення типу int, для цього використовується функція intdiv(). 1/2 дає значення з плаваючою комою 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) або (ціле число). Однак у більшості випадків приведення не потрібне, оскільки значення буде автоматично перетворено, якщо оператор, функція або керуюча структура вимагають аргумент типу int. Значення також можна перетворити до типу int за допомогою функції intval().

Якщо ресурс перетворюється в int, то результатом буде унікальний номер ресурсу, присвоєний йому PHP під час виконання.

Дивіться також Жонглювання типами.

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" as of PHP 8.1.0
var_dump(foo(8.1)); // 8 prior to PHP 8.1.0
var_dump(foo(8.0)); // 8 in both cases

var_dump((int)8.1); // 8 in both cases
var_dump(intval(8.1)); // 8 in both cases
?>

Якщо число з плаваючою комою виходить за межі int (зазвичай +/- 2.15e+9 = 2^31 на 32-бітних платформах і +/- 9.22e+18 = 2^63 на 64-бітних платформах), результат буде невизначеним, оскільки число з плаваючою комою не має достатньої точності, щоб дати точний результат типу int. Ніяких попереджень, навіть повідомлення не буде видано, коли це станеться!

Зауважте:

NaN та Infinity завжди дорівнюватимуть нулю при приведенні до типу int.

Ніколи не приводьте невідомий дріб до типу int, оскільки це може призвести до неочікуваних результатів.

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

Дивіться також попередження про точність поплавка.

Якщо рядок є числовим або ведучим числом, то він буде перетворений у відповідне ціле значення, інакше він буде перетворений у нуль (0).

null завжди перетворюється на нуль (0).

Поведінка перетворення до типу int для інших типів не визначена. Не покладайтеся на будь-яку спостережувану поведінку, оскільки вона може змінитися без попередження.