mirror of
https://github.com/php/doc-ru.git
synced 2025-07-21 23:23:20 +00:00

* Update types.xml to en * Update array.xml to en + infostyle * Update boolean.xml to en * Update callable.xml to en * Update float.xml to en * Update integer.xml to en * Update iterable.xml to en * Update numeric-strings.xml to en * Update object.xml to en * Update type-juggling.xml to en
321 lines
14 KiB
XML
321 lines
14 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: e587d0655e426f97b3fcb431453da5030e743b23 Maintainer: shein Status: ready -->
|
||
<!-- Reviewed: no -->
|
||
<sect1 xml:id="language.types.integer">
|
||
<title>Целые числа</title>
|
||
|
||
<simpara>
|
||
Тип <type>int</type> — число из множества ℤ = {..., -2, -1, 0, 1, 2, ...}.
|
||
</simpara>
|
||
|
||
<sect2 role="seealso">
|
||
&reftitle.seealso;
|
||
<para>
|
||
<simplelist>
|
||
<member>
|
||
<link linkend="language.types.float">Числа с плавающей точкой</link>
|
||
</member>
|
||
<member>
|
||
<link linkend="book.bc">Математические операции с числами произвольной точности функциями модуля BCMath</link>
|
||
</member>
|
||
<member>
|
||
<link linkend="book.gmp">Математические операции с числами множественной точности функциями модуля GNU Multiple Precision</link>
|
||
</member>
|
||
</simplelist>
|
||
</para>
|
||
</sect2>
|
||
|
||
<sect2 xml:id="language.types.integer.syntax">
|
||
<title>Синтаксис</title>
|
||
|
||
<simpara>
|
||
Целые числа (<type>int</type>) указывают в десятичной (основание 10), шестнадцатеричной
|
||
(основание 16), восьмеричной (основание 8) или двоичной (основание 2) системе счисления.
|
||
Отрицательные целые числа (<type>int</type>) указывают через
|
||
<link linkend="language.operators.arithmetic">оператор отрицания</link>.
|
||
</simpara>
|
||
|
||
<para>
|
||
Для записи в восьмеричной системе счисления перед числом ставят ноль — <literal>0</literal>.
|
||
Начиная с PHP 8.1.0 восьмеричную нотацию также дополнили символами <literal>0o</literal> или <literal>0O</literal>,
|
||
которые записывают перед числом.
|
||
Для записи в шестнадцатеричной системе счисления перед числом записывают <literal>0x</literal>.
|
||
Для записи в двоичной системе счисления перед числом указывают символы <literal>0b</literal>.
|
||
</para>
|
||
|
||
<para>
|
||
С PHP 7.4.0 появилась поддержка символов подчёркивания — <literal>_</literal>
|
||
между цифрами целочисленных литералов. Подчёркивания улучшают читаемость кода
|
||
и удаляются PHP-сканером.
|
||
</para>
|
||
|
||
<example>
|
||
<title>Целые числа</title>
|
||
<programlisting role="php" annotations="non-interactive">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
$a = 1234; // Десятичное число
|
||
$a = 0123; // Восьмеричное число (эквивалентно 83 в десятичной системе)
|
||
$a = 0o123; // Восьмеричное число (начиная с PHP 8.1.0)
|
||
$a = 0x1A; // Шестнадцатеричное число (эквивалентно 26 в десятичной системе)
|
||
$a = 0b11111111; // Двоичное число (эквивалентно 255 в десятичной системе)
|
||
$a = 1_234_567; // Десятичное число (с PHP 7.4.0)
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
|
||
<para>
|
||
Формально структуру целых чисел <type>int</type> приняли в PHP 8.1.0
|
||
(раньше не допускались восьмеричные префиксы <literal>0o</literal> или <literal>0O</literal>,
|
||
а до PHP 7.4.0 не допускалось подчёркивание):
|
||
</para>
|
||
|
||
<informalexample>
|
||
<programlisting>
|
||
<![CDATA[
|
||
десятичные : [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]+)*
|
||
|
||
целые : десятичные
|
||
| шестнадцатеричные
|
||
| восьмеричные
|
||
| двоичные
|
||
]]>
|
||
</programlisting>
|
||
</informalexample>
|
||
|
||
<para>
|
||
Размер типа <type>int</type> зависит от платформы, хотя обычно
|
||
максимальное значение равно примерно 2 миллиардам — 32 бита со знаком.
|
||
Максимальное значение на 64-битных платформах обычно составляет около 9E18.
|
||
PHP не поддерживает беззнаковые целые числа (<type>int</type>).
|
||
Размер типа <type>int</type> в байтах возвращает
|
||
константа <constant>PHP_INT_SIZE</constant>, максимальное целочисленное значение —
|
||
константа <constant>PHP_INT_MAX</constant>,
|
||
а константа <constant>PHP_INT_MIN</constant> содержит
|
||
минимальное целочисленное значение.
|
||
</para>
|
||
</sect2>
|
||
|
||
<sect2 xml:id="language.types.integer.overflow">
|
||
<title>Переполнение целых чисел</title>
|
||
|
||
<para>
|
||
Если PHP обнаружил, что число превышает размер типа <type>int</type>, язык будет интерпретировать число
|
||
как <type>float</type>. Аналогично, если результат операции лежит за границами типа <type>int</type>,
|
||
PHP преобразует результат во <type>float</type>.
|
||
</para>
|
||
|
||
<example>
|
||
<title>Пример переполнения целых чисел</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
$large_number = 50000000000000000000;
|
||
var_dump($large_number); // float(5.0E+19)
|
||
|
||
var_dump(PHP_INT_MAX + 1); // В 32-разрядной системе system: float(2147483648)
|
||
// В 64-разрядной системе: float(9.2233720368548E+18)
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
</sect2>
|
||
|
||
<sect2 xml:id="language.types.integer.division">
|
||
<title>Целочисленное деление</title>
|
||
|
||
<para>
|
||
В PHP нет оператора целочисленного (<type>int</type>) деления,
|
||
для этого пользуются функцией <function>intdiv</function>.
|
||
Результат вычисления выражения <literal>1/2</literal> выдаёт число с плавающей точкой (<type>float</type>) <literal>0.5</literal>.
|
||
Приведение этого значения к типу <type>int</type> округлит число в меньшую сторону,
|
||
но лучше предпочесть функцию <function>round</function>, которая точнее контролирует округление.
|
||
</para>
|
||
|
||
<example>
|
||
<title>Деление</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
var_dump(25 / 7); // float(3.5714285714286)
|
||
var_dump((int) (25 / 7)); // int(3)
|
||
var_dump(round(25 / 7)); // float(4)
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
</sect2>
|
||
|
||
<sect2 xml:id="language.types.integer.casting">
|
||
<title>Преобразование в целое</title>
|
||
|
||
<simpara>
|
||
Числа явно преобразовывают в тип <type>int</type> конструкциями
|
||
<literal>(int)</literal> или <literal>(integer)</literal>. Однако
|
||
в большей части случаев приведение типа не требуется, поскольку PHP автоматически
|
||
преобразует значение, если оператору, функции или управляющей структуре
|
||
требуется аргумент с типом <type>int</type>. Преобразовывать значение
|
||
в тип <type>int</type> также умеет функция <function>intval</function>.
|
||
</simpara>
|
||
|
||
<simpara>
|
||
Преобразование значения с типом <type>resource</type> в тип <type>int</type>
|
||
вернёт уникальный номер ресурса, который PHP присвоил значению с типом <type>resource</type>
|
||
во время выполнения.
|
||
</simpara>
|
||
|
||
<simpara>
|
||
Смотрите также раздел «<link linkend="language.types.type-juggling">Жонглирование типами</link>».
|
||
</simpara>
|
||
|
||
<sect3 xml:id="language.types.integer.casting.from-boolean">
|
||
<title>Из <link linkend="language.types.boolean">логического</link> типа</title>
|
||
|
||
<simpara>
|
||
Логическое значение &false; преобразовывается в ноль — <literal>0</literal>,
|
||
а &true; в единицу — <literal>1</literal>.
|
||
</simpara>
|
||
</sect3>
|
||
|
||
<sect3 xml:id="language.types.integer.casting.from-float">
|
||
<title>
|
||
Из <link linkend="language.types.float">чисел с плавающей точкой</link>
|
||
</title>
|
||
|
||
<simpara>
|
||
При преобразовании из типа <type>float</type> в тип <type>int</type> PHP округлит число
|
||
<emphasis>в меньшую сторону</emphasis>.
|
||
Начиная с PHP 8.1.0 при неявном преобразовании неинтегрального числа с плавающей точкой (&float;)
|
||
в целое число (&integer;), которое теряет точность, PHP выдаёт уведомление об устаревании.
|
||
</simpara>
|
||
|
||
<example>
|
||
<title>Приведение из числа с плавающей точкой</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?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 в обоих случаях
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
|
||
<para>
|
||
Приведение выдаст неопределённый реузльтат, если число с плавающей точкой превышает размеры
|
||
типа <type>int</type> (обычно <literal>± 2.15e+9 = 2^31</literal> на 32-битных системах
|
||
и <literal>± 9.22e+18 = 2^63</literal> на 64-битных системах),
|
||
поскольку у типа <type>float</type> нет достаточной точности,
|
||
чтобы вернуть правильный результат в виде целого числа (<type>int</type>).
|
||
PHP для таких случаев не выведет ни предупреждения, ни даже замечания!
|
||
</para>
|
||
<note>
|
||
<para>
|
||
Значения <literal>NaN</literal>, <literal>Inf</literal> и <literal>-Inf</literal>
|
||
при приведении к типу <type>int</type> становятся равными нулю.
|
||
</para>
|
||
</note>
|
||
<warning>
|
||
<para>
|
||
Нельзя приводить неизвестную дробь к типу <type>int</type>, поскольку это
|
||
иногда даёт неожиданные результаты.
|
||
</para>
|
||
|
||
<informalexample>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
echo (int) ((0.1 + 0.7) * 10); // выводит 7!
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</informalexample>
|
||
|
||
<para>
|
||
Подробнее об этом рассказывает параграф <link linkend="warn.float-precision">с предупреждением о точности чисел
|
||
с плавающей точкой</link>.
|
||
</para>
|
||
</warning>
|
||
</sect3>
|
||
|
||
<sect3 xml:id="language.types.integer.casting.from-string">
|
||
<title>Из строк</title>
|
||
|
||
<simpara>
|
||
<link linkend="language.types.numeric-strings">Числовые строки</link>
|
||
или строки, которые начинаются с числовых символов, разрешаются
|
||
в целочисленные значения, остальные строки преобразовываются в значение
|
||
<literal>0</literal>.
|
||
</simpara>
|
||
</sect3>
|
||
|
||
<sect3 xml:id="language.types.integer.casting-from-null">
|
||
<title>Из <type>NULL</type></title>
|
||
|
||
<simpara>
|
||
Значение &null; преобразовывается в ноль — <literal>0</literal>.
|
||
</simpara>
|
||
</sect3>
|
||
|
||
<sect3 xml:id="language.types.integer.casting.from-other">
|
||
<title>Из других типов</title>
|
||
|
||
<caution>
|
||
<simpara>
|
||
У поведения преобразования в тип <type>int</type> из других типов нет определения.
|
||
<emphasis>Нельзя</emphasis> полагаться на наблюдаемое поведение,
|
||
поскольку оно изменится в новых версиях языка без предупреждения.
|
||
</simpara>
|
||
</caution>
|
||
</sect3>
|
||
|
||
</sect2>
|
||
</sect1>
|
||
<!-- Keep this comment at the end of the file
|
||
Local variables:
|
||
mode: sgml
|
||
sgml-omittag:t
|
||
sgml-shorttag:t
|
||
sgml-minimize-attributes:nil
|
||
sgml-always-quote-attributes:t
|
||
sgml-indent-step:1
|
||
sgml-indent-data:t
|
||
indent-tabs-mode:nil
|
||
sgml-parent-document:nil
|
||
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
||
sgml-exposed-tags:nil
|
||
sgml-local-catalogs:nil
|
||
sgml-local-ecat-files:nil
|
||
End:
|
||
vim600: syn=xml fen fdm=syntax fdl=2 si
|
||
vim: et tw=78 syn=sgml
|
||
vi: ts=1 sw=1
|
||
-->
|