LoginSignup
9
3

More than 5 years have passed since last update.

PHPでintをオーバーフローさせた結果

Last updated at Posted at 2016-10-13

PHPのintの最大値と最小値

公式マニュアルの記載

PHP: 整数 - Manual

整数のサイズはプラットフォームに依存しますが、 約 20 億 (32 ビット符号付) が一般的な値です。 64 ビットプラットフォームでの通常の最大値は、およそ 9*10^18 (900京) になります。 しかし PHP 7 より前のバージョンにおける Windows は例外で、Windows で PHP 7 より前のバージョンを使う場合はは常に 32 ビットとなります。 PHP は符号無し整数をサポートしていません。 整数のサイズは定数 PHP_INT_SIZE で、 そして整数の最大値は定数 PHP_INT_MAX でそれぞれ決まります。 これらの定数は、PHP 4.4.0 以降および PHP 5.0.5 以降で使えます。 PHP 7.0.0 以降では、整数の最小値を表す定数 PHP_INT_MIN が使えるようになりました。

わかりづらいので整理してみた

  • 32bit
    • 約20億(32ビット符号付き整数)
    • -2,147,483,648 ~ 2,147,483,647
    • 21億4748万3647
    • 2038年問題の温床
  • 64bit
    • 約900京(64ビット符号付き整数)
    • ただし、PHP7未満のWindowsでは32bitと同じ
    • -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
    • 922京3372兆0368億5477万5807
  • 定数
    • 整数のサイズ:PHP_INT_SIZE
    • 最大値:PHP_INT_MAX
    • 最小値:PHP_INT_MIN ※PHP7以降

今回のお話し

オーバーフローしたらどうなるのだろう?intの最大値に+1、最小値に-1した結果を確認する。

検証環境

paiza.ioPHP Version => 7.0.8-0ubuntu0.16.04.1

検証コード

<?php
echo "INT_MAX",PHP_EOL;
$n = PHP_INT_MAX ;
var_dump($n);
$n++;
var_dump($n);
$n = (int) $n;
var_dump($n);

echo "INT_MIN",PHP_EOL;
$n = PHP_INT_MIN ;
var_dump($n);
$n--;
var_dump($n);
$n = (int) $n;
var_dump($n);
?>

結果

  • 最大値を+1するとfloat型になる
  • float型をintにキャストすると最小値になる
  • 最小値を-1するとfloat型になる
  • float型をintにキャストすると最小値のまま
INT_MAX
int(9223372036854775807) //PHP_INT_MAX
float(9.2233720368548E+18) //PHP_INT_MAX+1
int(-9223372036854775808) //↑をintに
INT_MIN
int(-9223372036854775808)  //PHP_INT_MIN
float(-9.2233720368548E+18) //PHP_INT_MIN-1
int(-9223372036854775808) //↑をintに

教訓

922京3372兆0368億5477万5808円も貯金しないようにしよう!

※現在の残高51円

9
3
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
9
3