JavaScriptを有効にしてください

【PHP】int型でオーバーフロー

 ·  ☕ 2 分で読めます

PHP の int最大値

PHP の int型の最大値は32bit環境では2147483647、64bit環境では9223372036854775808となります。
プログラム言語によりますが int型で宣言されているものが int型の桁数を超えた場合にオーバーフローが発生します。
でも、PHPは動的型付け言語のためint型の最大値を超えた場合は自動的に float型になります。

確認環境

通常の動作

1
2
3
4
5
<?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型最大値を超えた場合、オーバーフローします。

1
2
3
<?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

1
2
3
<?php
var_dump(intval(PHP_INT_MAX));
var_dump(intval(PHP_INT_MAX + 1));

実行結果

int(2147483647)
int(-2147483648)

結果はオーバーフローしてしまいます。
強制的に int型にした時にオーバーフローが発生してしまいます。

注意

パターンによってはオーバーフローも発生することがあるのでご注意ください。

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer