[PHP-users 28025] Re: 整数の下限

SAISHO Kazuhiro ml @ saisho.info
2006年 1月 4日 (水) 15:48:32 JST


税所です。
投稿のタイミングで、
先ほどの内容は宇野さんと重複してしまいました。
失礼致しました。

[PHP-users 28022]
> > 「-2147483647」は内部的には「1 - 2147483648」で、
> > 「1 - 2147483648」は float だが、「-2147483647」は integer ですよね、
> 
> ああ、なるほど。[PHP-users 28016]で書いていらっしゃる、
> 
> > 32ビット符号なし整数 0〜4294967295 を 2147483648(31ビット)分シフトして
> > 符号ありにしているということなのではないでしょうか?
> 
> って、そういう意味で言っていたのですね。それで、2147483648を引くとか
> 足すとかの「内部処理」にこだわっていらっしゃるわけですか…。
> 
> それは税所さんの誤解です。とりあえずIA-32アーキテクチャを例とした場合
> (他も大体そうです)の一般的な整数値表現はシフト表現ではなく2の補数表現
> で、PHP内部でもそのままその表現形式が使われています。
> 
> なので単純に32bitのビットパターン(MSBが左、LSBが右)で書くと、
>           0は 00000000000000000000000000000000
>           1は 00000000000000000000000000000001
>          -1は 11111111111111111111111111111111
>         100は 00000000000000000000000001100100
>        -100は 11111111111111111111111110011100
>  2147483647は 01111111111111111111111111111111
> -2147483647は 10000000000000000000000000000001
>  2147483648は 表現できない(範囲外)
> -2147483648は 10000000000000000000000000000000
> です。
> でも、PHPに与えた「-2147483648」という式はinteger型にはなりません。
> 
> PHPが「-2147483648」という式を評価するとき、まず「2147483648」という
> 数字の部分を評価します。この値は32bit integerでは表現しきれないので、
> 結果の型はfloatになります。それから「-」演算子を作用させます。なので
> 結果の型はfloatです。
> 「-247483647」がfloatにならずintegerになるのは、「2147483647」の値が
> 32bit integerで表現できるからです。

なるほど、そうすると、
var_dump (-2147483647 - 1) が int(-2147483648) になるのは、
「-2147483647」も「1」も integer で、
演算結果の「-2147483648」も32bitで表現できるため、
float にならず int になるとも考えられますね。
「-2147483648」という値自体は int なのに、
先に絶対値を評価するというパーサーの手順に
問題があるということなのですね。

たいへん参考になりました。
どうもありがとうございました。

--
税所 一弘 <ml @ saisho.info>



PHP-users メーリングリストの案内