hnwの日記

PHPで整数の範囲を超えたときの挙動について


(4/17追記twitter経由でタレコミがありまして、恥ずかしいミスをコッソリ直しました(32bit整数の範囲について)。どなたかわかりませんが、ありがとうございます!


PHPの整数(integer型)はCのlong型をそのまま利用しています。つまり、32bit環境であれば整数の範囲は-2^31から2^31-1までとなります。また、PHP 4.4.0以降および5.0.5以降、最大の整数を表す定数PHP_INT_MAXが利用できます。


ところで、最大の整数に1を足すと何が起こるのでしょうか。PHPマニュアルの「整数のオーバーフロー」にも記述がありますが、整数の範囲を超えるような演算の結果はfloat型となります。

<?php
var_dump(PHP_INT_MAX); // int(2147483647)
var_dump(PHP_INT_MAX+1); // float(2147483648)


そのため、整数の最大値や最小値の付近では一見不思議な現象が起こります。

続きを読む