<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.types.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'language.types.integer.php',
    1 => '整数',
    2 => '整数',
  ),
  'up' => 
  array (
    0 => 'language.types.php',
    1 => '型',
  ),
  'prev' => 
  array (
    0 => 'language.types.boolean.php',
    1 => '論理型 (boolean)',
  ),
  'next' => 
  array (
    0 => 'language.types.float.php',
    1 => '浮動小数点数',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'language/types/integer.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.types.integer" class="sect1">
 <h2 class="title">整数</h2>
 
 <p class="simpara">
  <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> は、ℤ = {..., -2, -1, 0, 1, 2, ...}
  という集合です。
 </p>
  
 <div class="sect2">
  <h3 class="title">参考</h3>
  <p class="para">
   <ul class="simplelist">
    <li><a href="language.types.float.php" class="link">浮動小数点数</a></li>
    <li><a href="book.bc.php" class="link">任意精度整数 / BCMath</a></li>
    <li><a href="book.gmp.php" class="link">任意精度整数 / GMP</a></li>
   </ul>
  </p>
 </div>

 <div class="sect2" id="language.types.integer.syntax">
  <h3 class="title">構文</h3>

  <p class="simpara">
   整数 (integer) は、10 進数(基数 10)、16 進数 (基数 16)、8 進数 (基数 8) あるいは 2 進数 (基数 2)
   表記で指定可能です。オプションで、符号(-または+)を前に付けることが可能です。
  </p>

  <p class="para">
   8 進数表記を使用する場合、数の前に <code class="literal">0</code> (ゼロ)
   を付ける必要があります。
   PHP 8.1.0 以降では、数の前に
   <code class="literal">0o</code> や <code class="literal">0O</code> を付けても
   8進数を表記できます。
   また、16 進数表記を使用するには、数の前に
   <code class="literal">0x</code> を付ける必要があります。
   2 進数表記を使用する場合、数の前に <code class="literal">0b</code> を付ける必要があります。
  </p>

  <p class="para">
   PHP 7.4.0 以降では、可読性を向上させるために整数リテラルの桁の間にアンダースコア
   (<code class="literal">_</code>) を含めることができるようになりました。
   アンダースコアは PHP の scanner が除去します。
  </p>

  <div class="example" id="example-1">
   <p><strong>例1 整数リテラル</strong></p>
   <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1234</span><span style="color: #007700">; </span><span style="color: #FF8000">// 10進整数<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">0123</span><span style="color: #007700">; </span><span style="color: #FF8000">// 8進数 (10進数の83と等価)<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">0o123</span><span style="color: #007700">; </span><span style="color: #FF8000">// 8進数 (PHP 8.1.0 以降)<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">0x1A</span><span style="color: #007700">; </span><span style="color: #FF8000">// 16進数 (10進数の26と等価)<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">0b11111111</span><span style="color: #007700">; </span><span style="color: #FF8000">// 2進数 (10進数の255と等価)<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1_234_567</span><span style="color: #007700">; </span><span style="color: #FF8000">// 10進数 (PHP 7.4.0 以降)<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>

  <p class="para">
   PHP 8.1.0 以降で使用可能な整数リテラルの形式は以下のように定義されています。
   (これより前のバージョンでは、8進数のプレフィックス <code class="literal">0o</code> や <code class="literal">0O</code> が許されませんでした。さらに、PHP 7.4.0 より前のバージョンでは、アンダースコアも許されませんでした)
  </p>
 
  <div class="informalexample">
   <div class="example-contents">
<div class="annotation-interactive cdata"><pre>
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
</pre></div>
   </div>

  </div>

  <p class="para">
   整数のサイズはプラットフォームに依存しますが、
   約 20 億 (32 ビット符号付) が一般的な値です。
   64 ビットプラットフォームでの通常の最大値は、およそ 9*10^18 (900京) になります。
   PHP は符号無し整数をサポートしていません。
   整数のサイズは定数 <strong><code><a href="reserved.constants.php#constant.php-int-size">PHP_INT_SIZE</a></code></strong> で、
   整数の最大値は定数 <strong><code><a href="reserved.constants.php#constant.php-int-max">PHP_INT_MAX</a></code></strong> で、
   整数の最小値は定数 <strong><code><a href="reserved.constants.php#constant.php-int-min">PHP_INT_MIN</a></code></strong> で決まります。
  </p>

 </div>

 <div class="sect2" id="language.types.integer.overflow">
  <h3 class="title">整数のオーバーフロー</h3>

  <p class="para">
   <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>型の範囲外の数を指定した場合、かわりに
   <span class="type"><a href="language.types.float.php" class="type float">float</a></span>として解釈されます。また、結果が
   <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>型の範囲外の数となるような計算を行うと
   <span class="type"><a href="language.types.float.php" class="type float">float</a></span>が代わりに返されます。
  </p>

  <div class="example" id="example-2">
   <p><strong>例2 整数のオーバーフロー</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$large_number </span><span style="color: #007700">= </span><span style="color: #0000BB">50000000000000000000</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$large_number</span><span style="color: #007700">);         </span><span style="color: #FF8000">// float(5.0E+19)<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">PHP_INT_MAX </span><span style="color: #007700">+ </span><span style="color: #0000BB">1</span><span style="color: #007700">);       </span><span style="color: #FF8000">// 32-bit system: float(2147483648)<br />                                 // 64-bit system: float(9.2233720368548E+18)<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect2" id="language.types.integer.division">
  <h3 class="title">整数の除算</h3>

  <p class="para">
   PHP には整数の割り算を行う演算子はありません。
   整数の割り算を行うには、<span class="function"><a href="function.intdiv.php" class="function">intdiv()</a></span> 関数を使って下さい。
   <code class="literal">1/2</code> は <span class="type">
   float </span> 型の <code class="literal">0.5</code> になります。
   0 に近い方向の整数値に値を丸めるためにキャストを使用することができ、
   また、<span class="function"><a href="function.round.php" class="function">round()</a></span> 関数を使用することもできます。
  </p>

  <div class="example" id="example-3">
   <p><strong>例3 除算の例</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">25</span><span style="color: #007700">/</span><span style="color: #0000BB">7</span><span style="color: #007700">);         </span><span style="color: #FF8000">// float(3.5714285714286)<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">((int) (</span><span style="color: #0000BB">25</span><span style="color: #007700">/</span><span style="color: #0000BB">7</span><span style="color: #007700">)); </span><span style="color: #FF8000">// int(3)<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">round</span><span style="color: #007700">(</span><span style="color: #0000BB">25</span><span style="color: #007700">/</span><span style="color: #0000BB">7</span><span style="color: #007700">));  </span><span style="color: #FF8000">// float(4)<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect2" id="language.types.integer.casting">
  <h3 class="title">整数への変換</h3>

  <p class="simpara">
   <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> に値を明示的に変換するには、キャスト
   <code class="literal">(int)</code>
   を使用してください。しかし、多くの場合、演算子、関数、制御構造が
   <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> 引数を必要とする場合、値は自動的に変換されるため、
   キャストを使用する必要はありません。
   関数 <span class="function"><a href="function.intval.php" class="function">intval()</a></span> を用いて値を整数に変換することも可能です。
  </p>

  <p class="simpara">
   <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span> を <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> に変換すると、その結果は一意なリソース番号となります。
   これは、その <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span> に対して PHP が実行時に割り当てた番号です。
  </p>

  <p class="simpara">
   <a href="language.types.type-juggling.php" class="link">型の相互変換</a>
   を参照ください。
  </p>
   
  <div class="sect3" id="language.types.integer.casting.from-boolean">
   <h4 class="title"><a href="language.types.boolean.php" class="link">booleans</a> から</h4>

   <p class="simpara">
    <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> は、<code class="literal">0</code> (ゼロ) となり、
    <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> は、<code class="literal">1</code> となります。
   </p>
  </div>

  <div class="sect3" id="language.types.integer.casting.from-float">
   <h4 class="title">
    <a href="language.types.float.php" class="link">浮動小数点数</a>から
   </h4> 

   <p class="simpara">
    float から整数に変換する場合、その数は<em>ゼロのほうに</em>丸められます。
    PHP 8.1.0 以降では、精度を損なうことになる <span class="type"><a href="language.types.float.php" class="type float">float</a></span> から <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> への暗黙の変換は推奨されなくなり、警告が発生します。
   </p>

   <div class="example" id="example-4">
    <p><strong>例4 float 型からキャストする</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$value</span><span style="color: #007700">): </span><span style="color: #0000BB">int </span><span style="color: #007700">{<br />  return </span><span style="color: #0000BB">$value</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">8.1</span><span style="color: #007700">)); </span><span style="color: #FF8000">// PHP 8.1.0 以降では "Deprecated: Implicit conversion from float 8.1 to int loses precision"<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">8.1</span><span style="color: #007700">)); </span><span style="color: #FF8000">// PHP 8.1.0 より前のバージョンでは 8<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">8.0</span><span style="color: #007700">)); </span><span style="color: #FF8000">// PHP 8.1.0 より前でもあとでも、8<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">((int) </span><span style="color: #0000BB">8.1</span><span style="color: #007700">); </span><span style="color: #FF8000">// PHP 8.1.0 より前でもあとでも、8<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">intval</span><span style="color: #007700">(</span><span style="color: #0000BB">8.1</span><span style="color: #007700">)); </span><span style="color: #FF8000">// PHP 8.1.0 より前でもあとでも、8<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
    
   <p class="para">
    float が整数の範囲 (通常は、32 ビットプラットフォームでは <code class="literal">+/- 2.15e+9 =
    2^31</code>、64 ビットプラットフォームでは <code class="literal">+/- 9.22e+18 = 2^63</code>
    ) を越える場合、結果は undefined となります。これは、
    その float が正しい整数の結果を得るために十分な精度を得られなかったからです。
    この場合、警告も通知も発生しません!
   </p>

   <blockquote class="note"><p><strong class="note">注意</strong>: 
    <p class="para">
     <code class="literal">NaN</code>, <code class="literal">Inf</code>, <code class="literal">-Inf</code> を <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> にキャストした結果は、常にゼロとなります。
    </p>
   </p></blockquote>
    
   <div class="warning"><strong class="warning">警告</strong>
    <p class="para">
     未知の端数を <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> にキャストしないでください。
     この場合、予期しない結果となることがあります。
    </p>

    <div class="informalexample">
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo (int) ( (</span><span style="color: #0000BB">0.1</span><span style="color: #007700">+</span><span style="color: #0000BB">0.7</span><span style="color: #007700">) * </span><span style="color: #0000BB">10 </span><span style="color: #007700">); </span><span style="color: #FF8000">// 7が出力されます!<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    
    <p class="para">
     より詳細な情報については、<a href="language.types.float.php#warn.float-precision" class="link">
     float の精度に関する注意</a>を参照ください。
    </p>
   </div>
  </div>
   
  <div class="sect3" id="language.types.integer.casting.from-string">
   <h4 class="title">文字列から</h4>

   <p class="simpara">
    文字列が 
    <a href="language.types.numeric-strings.php" class="link">数値形式の文字列</a>
    の場合は、対応する整数値に解決されます。
    そうでない場合は、ゼロ (<code class="literal">0</code>) に変換されます。
   </p>
  </div>
   
  <div class="sect3" id="language.types.integer.casting-from-null">
   <h4 class="title"><span class="type"><a href="language.types.null.php" class="type NULL">NULL</a></span> から</h4>

   <p class="simpara">
    <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> は、常に0に変換されます。
   </p>
  </div>

  <div class="sect3" id="language.types.integer.casting.from-other">
   <h4 class="title">他の型から</h4>

   <div class="caution"><strong class="caution">警告</strong>
    <p class="simpara">
     整数への変換の動作は、他の型については定義されません。
     現在の動作は、その値がまず
     <a href="language.types.boolean.php#language.types.boolean.casting" class="link">論理値に変換された</a>
     場合と同じです。しかし、この動作は予告なく変更されることがありえるので、
     これを前提にしてはいけません。
    </p>
   </div>
  </div>

 </div>
</div><?php manual_footer($setup); ?>