2^32 前後の数値について

% php -r '$nums = array(2147483647, 2147483648, 2147483649, -2147483647, -2147483648, -2147483649);
var_dump($nums, array_map("intval", $nums));'
array(6) {
  [0]=>int(2147483647)
  [1]=>float(2147483648)
  [2]=>float(2147483649)
  [3]=>int(-2147483647)
  [4]=>float(-2147483648)
  [5]=>float(-2147483649)
}
array(6) {
  [0]=>int(2147483647)
  [1]=>int(-2147483648)
  [2]=>int(-2147483647)
  [3]=>int(-2147483647)
  [4]=>int(-2147483648)
  [5]=>int(-2147483648)
}

何でこんな仕様なのか、分からないではないけどやっぱりキモい... float(2147483648) が int(-2147483648) にキャストされることなんか知っておかないと絶対ハマる。


PHP にも組み込み型として任意精度実数 (numeric) 型と複素数 (complex) 型がほしいなあ。
あと基本型のタイプヒンティング。