mirror of
https://github.com/php/doc-ru.git
synced 2026-03-25 16:22:18 +01:00
322 lines
14 KiB
XML
322 lines
14 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: 161dde4fe721309398dd324edbf02aec409f127b 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">
|
||
<![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>, он будет преобразован во <type>float</type>.
|
||
</para>
|
||
|
||
<example>
|
||
<title>Переполнение целых на 32-битных системах</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?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)
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
|
||
<example>
|
||
<title>Переполнение целых на 64-битных системах</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?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)
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
|
||
<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>
|
||
|
||
<informalexample>
|
||
<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>
|
||
</informalexample>
|
||
</sect2>
|
||
|
||
<sect2 xml:id="language.types.integer.casting">
|
||
<title>Преобразование в целое</title>
|
||
|
||
<simpara>
|
||
Для явного преобразования в тип <type>int</type> используют приведение
|
||
<literal>(int)</literal> или <literal>(integer)</literal>. Однако
|
||
в большинстве случаев в приведении типа нет необходимости, так как значение
|
||
будет автоматически преобразовано, если оператор, функция или управляющая структура
|
||
требует аргумент типа <type>int</type>. Значение также может быть преобразовано в
|
||
тип <type>int</type> функцией <function>intval</function>.
|
||
</simpara>
|
||
|
||
<simpara>
|
||
Если значением с типом <type>resource</type> преобразовывается в значением с типом <type>int</type>, то
|
||
результатом будет уникальный номер ресурса, привязанный к
|
||
<type>resource</type> во время исполнения PHP программы.
|
||
</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> число будет округлено
|
||
<emphasis>вниз</emphasis>.
|
||
Начиная с PHP 8.1.0 при неявном преобразовании неинтегрального числа с плавающей точкой (&float;)
|
||
в целое число (&integer;), которое теряет точность, выдаётся уведомление об устаревании.
|
||
</simpara>
|
||
|
||
<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>
|
||
|
||
<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>).
|
||
В этом случае не будет выведено ни предупреждения, ни даже замечания!
|
||
</para>
|
||
<note>
|
||
<para>
|
||
Значения NaN и Infinity при приведении к <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
|
||
-->
|