LoginSignup
3
0

More than 3 years have passed since last update.

PHPのintの最大値を超えた場合の挙動はどうなるか?

Last updated at Posted at 2019-07-31

先日、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の最小値となりました。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0