Работа с целочисленными значениями в языке PHP

Раздел: Основы PHP -> Целочисленный тип

Работа с целыми числами в PHP

Целочисленный тип (int) в PHP предназначен для хранения целых чисел из диапазона, зависящего от разрядности платформы. На 64-битных системах целые числа занимают 8 байт и могут принимать значения от -9223372036854775808 до 9223372036854775807. Для работы с этими пределами PHP предоставляет константы PHP_INT_MAX, PHP_INT_MIN и PHP_INT_SIZE. Целое число записывается в десятичном, восьмеричном (с префиксом 0), шестнадцатеричном (0x) или двоичном (0b) виде.

$decimal = 42;
$octal = 077;     // 63 в десятичной
$hex = 0xFF;      // 255
$binary = 0b1010; // 10

При выходе за пределы допустимого диапазона целое число автоматически преобразуется в число с плавающей точкой (float).

Как преобразовать строку в целое число?

Используется явное приведение (int) или функция intval(). Приведение отбрасывает дробную часть и игнорирует нечисловые символы после цифр.

$str = '123abc';
$num = (int) $str; // 123
int(123)
Если строка начинается с нецифрового символа, результатом становится 0. Например, (int) 'abc123' вернёт 0. Для строгой проверки используйте filter_var() с флагом FILTER_VALIDATE_INT.

Как проверить, является ли переменная целым числом?

Функция is_int() (или is_integer()) возвращает true, только если переменная имеет тип int и её значение - целое число. Для проверки строковой цифры используйте ctype_digit().

$var = 10;
if (is_int($var)) { echo 'Целое'; }
Целое
Функция is_numeric() возвращает true для чисел с плавающей точкой и строк, содержащих числа, поэтому для строгой проверки на int она не подходит.

Как избежать переполнения при арифметических операциях?

Если результат операции выходит за пределы PHP_INT_MAX, PHP автоматически преобразует его в float. Для работы с большими целыми числами без потери точности используйте расширение BC Math (строковые операции).

$big = PHP_INT_MAX;
$overflow = $big + 1; // становится float
var_dump($overflow);
float(9.223372036854776E+18)
При переполнении точность теряется. Для точных вычислений с большими числами применяйте bcadd(), bcmul() и т.д.

Как выполнить целочисленное деление без остатка?

Функция intdiv() возвращает целую часть от деления. Оператор % даёт остаток.

$result = intdiv(10, 3); // 3
$remainder = 10 % 3;     // 1
int(3)
int(1)
При делении на ноль intdiv() и оператор % вызывают ошибку деления на ноль. Необходима проверка делителя.

Как использовать целые числа в условиях и циклах?

Целое число в логическом контексте считается false только для 0, все остальные значения - true. В циклах for и foreach ключи являются целыми числами.

for ($i = 0; $i < 3; $i++) {
    echo $i;
}
012
Неявное приведение строки к int может дать неожиданный результат. Сравнение 0 == 'abc' даёт true, поэтому используйте строгое сравнение (===).

Расширенные примеры работы с целыми числами

Пример 1: Побитовые операции и сдвиги.

Пример
$a = 0b1100; // 12
$b = 0b1010; // 10
$and = $a & $b;  // 8 (1000)
$or  = $a | $b;  // 14 (1110)
$xor = $a ^ $b;  // 6 (0110)
$left = $a << 2; // 48 (110000)
$right = $a >> 2; // 3 (11)
echo "AND: $and, OR: $or, XOR: $xor, LEFT: $left, RIGHT: $right";
AND: 8, OR: 14, XOR: 6, LEFT: 48, RIGHT: 3

Пример 2: Генерация криптостойкого случайного целого числа.

Пример
$secure = random_int(1, 100);
echo $secure;
(случайное число от 1 до 100, например 42)

Пример 3: Использование strict_types для строгой типизации.

Пример
declare(strict_types=1);
function sum(int $a, int $b): int {
    return $a + $b;
}
echo sum(5, 10); // 15
// sum('5', 10) вызовет TypeError
15
При включённой строгой типизации передача строки вместо int приведёт к фатальной ошибке.

Пример 4: Преобразование из других систем счисления через base_convert и hexdec.

Пример
$hex = 'FF';
$dec = hexdec($hex); // 255
$bin = decbin($dec); // '11111111'
$oct = decoct($dec); // '377'
echo "Dec: $dec, Bin: $bin, Oct: $oct";
Dec: 255, Bin: 11111111, Oct: 377

Пример 5: Использование filter_var для безопасного приведения строкового целого.

Пример
$input = '  123  ';
$filtered = filter_var($input, FILTER_VALIDATE_INT);
if ($filtered !== false) {
    echo "Целое: $filtered";
} else {
    echo "Не целое";
}
Целое: 123
Фильтр FILTER_VALIDATE_INT по умолчанию допускает пробелы, но не допускает нецифровые символы.

Пример 6: Математические операции с переполнением и использование BC Math.

Пример
$a = PHP_INT_MAX;
$b = "9999999999999999999";
$sum = bcadd($a, $b); // строковое сложение
echo $sum;
19223372036854775806

Пример 7: Остаток от деления для отрицательных чисел.

Пример
$res = -10 % 3; // -1, так как знак сохраняется
$pos = abs(-10) % 3; // 1
echo "Прямой: $res, Через abs: $pos";
Прямой: -1, Через abs: 1

Пример 8: Получение целой части числа с помощью intval и приведение через (int) для разных типов.

Пример
$float = 3.99;
$int1 = intval($float);   // 3
$int2 = (int) $float;      // 3
$bool = true;
$int3 = intval($bool);     // 1
echo "$int1 $int2 $int3";
3 3 1

Тип int в PHP - comments

En
Php int (php)