1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-25 16:22:18 +01:00
Files
archived-doc-ru/language/types/integer.xml
2024-01-12 16:59:32 +03:00

322 lines
14 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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> — это число из множества &#8484; = {..., -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
-->