先日、MySQLのintの最大値を超えるとどういう挙動になるかを記載しましたが、
Databaseに登録するプラグラム側はどうなんでしょう。
ということで今回は、
PHPのintの最大値を超えた場合の挙動はどうなるか?にします。
整数のサイズはプラットフォームに依存しますが、 約 20 億 (32 ビット符号付) が一般的な値です。 64 ビットプラットフォームでの通常の最大値は、およそ 9*10^18 (900京) になります。 しかし PHP 7 より前のバージョンにおける Windows は例外で、Windows で PHP 7 より前のバージョンを使う場合はは常に 32 ビットとなります。 PHP は符号無し整数をサポートしていません。 整数のサイズは定数 PHP_INT_SIZE で、 そして整数の最大値は定数 PHP_INT_MAX でそれぞれ決まります。 これらの定数は、PHP 5.0.5 以降で使えます。 PHP 7.0.0 以降では、整数の最小値を表す定数 PHP_INT_MIN が使えるようになりました。
参照:https://www.php.net/manual/ja/language.types.integer.php
結論からいうと
phpのintの最大値を超えるとオーバーフローして自動でfloatになる
という記載があったので本当にその挙動になるのかを確かめてみました。
intの最大値は
32bitは約21億「2147483647」
64bitは約900京
64bitはPHP7.0.0以降になります。
オーバーフローさせてみる
$int_test = 2147483647;
var_dump($int_test);
$int_test = 2147483648;
var_dump($int_test);
int(2147483647)
int(2147483648)
オーバーフローしない、
$int_test = 9223372036854775807;
var_dump($int_test);
$int_test = 9223372036854775808;
var_dump($int_test);
int(9223372036854775807)
float(9.2233720368548E+18)
オーバーフローしました。
ということで、
$> php -v
PHP 7.1.0
私の 環境はPHP7でした。
ちなみに、
オーバーフローする値をintにキャストしたらどうなるのか?
$int_test = (int)9223372036854775808;
var_dump($int_test);
int(-9223372036854775808)
結果は
PHP_INT_MIN
のintの最小値となりました。