PHPのintの最大値と最小値
公式マニュアルの記載
整数のサイズはプラットフォームに依存しますが、 約 20 億 (32 ビット符号付) が一般的な値です。 64 ビットプラットフォームでの通常の最大値は、およそ 9*10^18 (900京) になります。 しかし PHP 7 より前のバージョンにおける Windows は例外で、Windows で PHP 7 より前のバージョンを使う場合はは常に 32 ビットとなります。 PHP は符号無し整数をサポートしていません。 整数のサイズは定数 PHP_INT_SIZE で、 そして整数の最大値は定数 PHP_INT_MAX でそれぞれ決まります。 これらの定数は、PHP 4.4.0 以降および PHP 5.0.5 以降で使えます。 PHP 7.0.0 以降では、整数の最小値を表す定数 PHP_INT_MIN が使えるようになりました。
わかりづらいので整理してみた
- 32bit
- 約20億(32ビット符号付き整数)
- -2,147,483,648 ~ 2,147,483,647
- 21億4748万3647
- 2038年問題の温床
- 64bit
- 約900京(64ビット符号付き整数)
- ただし、PHP7未満のWindowsでは32bitと同じ
- -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
- 922京3372兆0368億5477万5807
- 約900京(64ビット符号付き整数)
- 定数
- 整数のサイズ:PHP_INT_SIZE
- 最大値:PHP_INT_MAX
- 最小値:PHP_INT_MIN ※PHP7以降
今回のお話し
オーバーフローしたらどうなるのだろう?intの最大値に+1、最小値に-1した結果を確認する。
検証環境
paiza.io:PHP Version => 7.0.8-0ubuntu0.16.04.1
検証コード
<?php
echo "INT_MAX",PHP_EOL;
$n = PHP_INT_MAX ;
var_dump($n);
$n++;
var_dump($n);
$n = (int) $n;
var_dump($n);
echo "INT_MIN",PHP_EOL;
$n = PHP_INT_MIN ;
var_dump($n);
$n--;
var_dump($n);
$n = (int) $n;
var_dump($n);
?>
結果
- 最大値を+1するとfloat型になる
- float型をintにキャストすると最小値になる
- 最小値を-1するとfloat型になる
- float型をintにキャストすると最小値のまま
INT_MAX
int(9223372036854775807) //PHP_INT_MAX
float(9.2233720368548E+18) //PHP_INT_MAX+1
int(-9223372036854775808) //↑をintに
INT_MIN
int(-9223372036854775808) //PHP_INT_MIN
float(-9.2233720368548E+18) //PHP_INT_MIN-1
int(-9223372036854775808) //↑をintに
教訓
922京3372兆0368億5477万5808円も貯金しないようにしよう!
※現在の残高51円