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

UNO Shintaro uno @ venus.dti.ne.jp
2006年 1月 4日 (水) 15:22:43 JST


> 「-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で表現できるからです。

-- 
UNO Shintaro, 宇野 信太郎  ( mailto:uno @ venus.dti.ne.jp )
http://www.venus.dti.ne.jp/~uno/  http://d.hatena.ne.jp/uno/



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