[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 メーリングリストの案内