1
0
mirror of https://github.com/php/doc-ja.git synced 2026-03-24 07:02:08 +01:00
Files
archived-doc-ja/language/types/integer.xml
2026-01-12 17:50:39 +09:00

306 lines
10 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 78a11d3ca004ee937549d932e77a79c51b9777cd Maintainer: takagi Status: ready -->
<!-- CREDITS: hirokawa,shimooka,mumumu -->
<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">任意精度整数 / GMP</link></member>
</simplelist>
</para>
</sect2>
<sect2 xml:id="language.types.integer.syntax">
<title>構文</title>
<simpara>
整数 (integer) は、10 進数(基数 10)、16 進数 (基数 16)、8 進数 (基数 8) あるいは 2 進数 (基数 2)
表記で指定可能です。オプションで、符号(-または+)を前に付けることが可能です。
</simpara>
<para>
8 進数表記を使用する場合、数の前に <literal>0</literal> (ゼロ)
を付ける必要があります。
PHP 8.1.0 以降では、数の前に
<literal>0o</literal><literal>0O</literal> を付けても
8進数を表記できます。
また、16 進数表記を使用するには、数の前に
<literal>0x</literal> を付ける必要があります。
2 進数表記を使用する場合、数の前に <literal>0b</literal> を付ける必要があります。
</para>
<para>
PHP 7.4.0 以降では、可読性を向上させるために整数リテラルの桁の間にアンダースコア
(<literal>_</literal>) を含めることができるようになりました。
アンダースコアは PHP の scanner が除去します。
</para>
<example>
<title>整数リテラル</title>
<programlisting role="php" annotations="non-interactive">
<![CDATA[
<?php
$a = 1234; // 10進整数
$a = 0123; // 8進数 (10進数の83と等価)
$a = 0o123; // 8進数 (PHP 8.1.0 以降)
$a = 0x1A; // 16進数 (10進数の26と等価)
$a = 0b11111111; // 2進数 (10進数の255と等価)
$a = 1_234_567; // 10進数 (PHP 7.4.0 以降)
?>
]]>
</programlisting>
</example>
<para>
PHP 8.1.0 以降で使用可能な整数リテラルの形式は以下のように定義されています。
(これより前のバージョンでは、8進数のプレフィックス <literal>0o</literal><literal>0O</literal> が許されませんでした。さらに、PHP 7.4.0 より前のバージョンでは、アンダースコアも許されませんでした)
</para>
<informalexample>
<programlisting>
<![CDATA[
decimal : [1-9][0-9]*(_[0-9]+)*
| 0
hexadecimal : 0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)*
octal : 0[oO]?[0-7]+(_[0-7]+)*
binary : 0[bB][01]+(_[01]+)*
integer : decimal
| hexadecimal
| octal
| binary
]]>
</programlisting>
</informalexample>
<para>
整数のサイズはプラットフォームに依存しますが、
約 20 億 (32 ビット符号付) が一般的な値です。
64 ビットプラットフォームでの通常の最大値は、およそ 9*10^18 (900京) になります。
PHP は符号無し整数をサポートしていません。
整数のサイズは定数 <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>
<type>int</type>型の範囲外の数を指定した場合、かわりに
<type>float</type>として解釈されます。また、結果が
<type>int</type>型の範囲外の数となるような計算を行うと
<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-bit system: float(2147483648)
// 64-bit system: float(9.2233720368548E+18)
?>
]]>
</programlisting>
</example>
</sect2>
<sect2 xml:id="language.types.integer.division">
<title>整数の除算</title>
<para>
PHP には整数の割り算を行う演算子はありません。
整数の割り算を行うには、<function>intdiv</function> 関数を使って下さい。
<literal>1/2</literal><type>
float </type> 型の <literal>0.5</literal> になります。
0 に近い方向の整数値に値を丸めるためにキャストを使用することができ、
また、<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>
を使用してください。しかし、多くの場合、演算子、関数、制御構造が
<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">booleans</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>
float から整数に変換する場合、その数は<emphasis>ゼロのほうに</emphasis>丸められます。
PHP 8.1.0 以降では、精度を損なうことになる &float; から &integer; への暗黙の変換は推奨されなくなり、警告が発生します。
</simpara>
<example>
<title>float 型からキャストする</title>
<programlisting role="php">
<![CDATA[
<?php
function foo($value): int {
return $value;
}
var_dump(foo(8.1)); // PHP 8.1.0 以降では "Deprecated: Implicit conversion from float 8.1 to int loses precision"
var_dump(foo(8.1)); // PHP 8.1.0 より前のバージョンでは 8
var_dump(foo(8.0)); // PHP 8.1.0 より前でもあとでも、8
var_dump((int) 8.1); // PHP 8.1.0 より前でもあとでも、8
var_dump(intval(8.1)); // PHP 8.1.0 より前でもあとでも、8
?>
]]>
</programlisting>
</example>
<para>
float が整数の範囲 (通常は、32 ビットプラットフォームでは <literal>+/- 2.15e+9 =
2^31</literal>、64 ビットプラットフォームでは <literal>+/- 9.22e+18 = 2^63</literal>
) を越える場合、結果は undefined となります。これは、
その float が正しい整数の結果を得るために十分な精度を得られなかったからです。
この場合、警告も通知も発生しません!
</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">
float の精度に関する注意</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; は、常に0に変換されます。
</simpara>
</sect3>
<sect3 xml:id="language.types.integer.casting.from-other">
<title>他の型から</title>
<caution>
<simpara>
整数への変換の動作は、他の型については定義されません。
現在の動作は、その値がまず
<link linkend="language.types.boolean.casting">論理値に変換された</link>
場合と同じです。しかし、この動作は予告なく変更されることがありえるので、
これを前提にしてはいけません。
</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
-->