【PHP】int型でオーバーフロー
PHP の int最大値
PHP の int型の最大値は32bit環境では2147483647、64bit環境では9223372036854775808となります。 プログラム言語によりますが int型で宣言されているものが int型の桁数を超えた場合にオーバーフローが発生します。 でも、PHPは動的型付け言語のためint型の最大値を超えた場合は自動的に float型になります。
確認環境
補足
PHP Version:8.0.1
通常の動作
<?php
// 桁数が多いため32bit版での説明
$max = PHP_INT_MAX; // 2147483647
var_dump($max);
var_dump($max + 1);
実行結果
int(2147483647)
float(2147483648)
実行すると自動的に float型に切り替わってしまいます。 ですがPHPでもオーバーフローが発生する場合があるのです。 ちなみにPHP_INT_MAXはその環境での int型最大値を取得してくれます。
オーバーフロー
オーバーフローするパターンです。
配列キー
配列の数値キーが int型最大値を超えた場合、オーバーフローします。
<?php
$hoge = array(PHP_INT_MAX => "MAX", PHP_INT_MAX + 1 => "OVER FLOW");
var_dump($hoge);
実行結果
array(2) {
[2147483647]=> string(3) "MAX"
[-2147483648]=> string(9) "OVER FLOW"
}
結果は上記の通りになってしまいます。 なので配列の数値キーを使う場合はお気をつけ下さい。
intval関数
intval関数を使用した際に、int型の最大値を超えた float型の値を、強制的に int型にするため発生します。 PHP: intval - Manual
<?php
var_dump(intval(PHP_INT_MAX));
var_dump(intval(PHP_INT_MAX + 1));
実行結果
int(2147483647)
int(-2147483648)
結果はオーバーフローしてしまいます。 強制的に int型にした時にオーバーフローが発生してしまいます。
注意
パターンによってはオーバーフローも発生することがあるのでご注意ください。