[PHP-users 1412] Re: PHPのint 境界とfloatへの型変換

Atushi Sakauchi php-users@php.gr.jp
Thu, 23 Aug 2001 12:28:58 +0900


坂内です.

At Thu, 23 Aug 2001 02:42:22 +0900,
S.Sugichan <sugichan@tkd.att.ne.jp> wrote:

> 田中さん文献を調べてもらってご苦労さまでした。C言語に関しては、今後
> short/longと型が決まっているかたちを心がけて使うようにしたいと思います。

Java は,言語仕様で各整数型の大きさを明確に定めていますが,
言語C には,規格で XX bit と大きさの定めれらた整数型は存在しません.
規格合致処理系では,各整数型の大きさは文書化されていることが保証され,
また limits.h に LONG_MAX などのシンボルが #define されます.

> かなり、C言語の話になってしまったC言語の話はこの辺までとして、表題の話
> に軌道修正をします。

PHP の integer 型は,言語C の long 型で実装されています.
C90 規格に準拠した処理系であれば,32bit 以上であることが保証されます.
「以上」なので 64bit かも 128bit かもしれません.
何かの場面で int型の限界を決め打ちしているスクリプトは
移植性に欠けることになります.

LONG_MAX に相当する,「スクリプトから integer型の限界を知る方法」は
PHPには,ないと思います.( 私が見逃してるだけかも )
変数の型が自動的に変換されることを利用して,

  $i = 0x10000000;
  if ( gettype( $i ) == "double" ) {
    /* 33 bit な数は int の限界を越えるようだ */
  }

ということは可能だと思いますが.

> この動きに違いの理由が判るはいらっしゃいますか?
> 
> PHP単なるバグなんでしょうか?

『更に、関数または演算子が、integerの範囲外の数を生成 する場合も自動的に
floatに変換されます。』
とマニュアルに書いてある以上,バグと言われてもしかたないような…

> それとも$i++はループで多用されるため、出来るだけ早いコードにしようとした
> 結果なのでしょうか?

手元の環境では,PHP-users 1211 をあてても実行時間に有意な差はないです.
毎回変換が必要なわけではなく,元の値を,LONG_MAX 
( -- の場合は LONG_MIN ) と比較するだけですから.