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

TAKAGI Masahiro matakagi @ osk2.3web.ne.jp
2006年 1月 4日 (水) 12:23:08 JST


高木です。

At Wed, 4 Jan 2006 11:59:22 +0900,
SAISHO Kazuhiro wrote:
> 
> 税所です。
> ご回答ありがとうございます。
> 
> [PHP-users 28008]
> > さわいです。
> > 学習中ということで 意地悪です。
> 
> ・・・(^^;
> 
さわいさんが憎まれ役を担当してくださったので、私は優しい役をやらせてい
ただきます :-)

> > > 次の2行がどうしてなのかわかりません。
> > 
> > どのようになるべきだと 税所さんは 思われますか?
> > 
> > > var_dump (-2147483647 - 1);  # int(-2147483648)
> > > var_dump (-2147483648    );  # float(-2147483648)
> 
> 32ビットの半分が 0 〜 2147483647、
> 残りの半分が -2147483648 〜 -1、
> と考えると、
マニュアルにも書かれていますが (*1)、int 型のサイズはプラットフォーム
に依存します。

> var_dump (-2147483648) が「int(-2147483648)」を
> 返してくれてもよさそうな気もしないでもありません、、(冷汗
> 
> 如何でしょうか?
> 
PHP 内部では、-2147483648 は (0 - 2147483648) と解釈されるようです。
2147483648 は int 型の範囲を超えているので float として扱われ、int と 
float の演算結果が float として扱われているということでしょう(*2)。

実は私も税所さんのメールを読むまでこのことは知りませんでした。「学習中」
とのことですので、私がどのようにして調べたのかを簡単に説明しておきます。

0. 実際に税所さんの書かれたコードを動かしてみて、おっしゃられるような
   動きをすることを確認した
1. マニュアルの「型」関連のページにひととおり目を通した(*3)。
2. http://bugs.php.net/search.php (PHP のバグ検索ページ) に行った。
3. キーワードに "2147483648 int float" を指定し、その下のチェック
   ボックスで「all」を選択して「Search」ボタンを押した
4. 検索結果一覧のページから、怪しそうなものを調べてみた
5. http://bugs.php.net/bug.php?id=24381 を見つけた
6. ↑のコメントから http://bugs.php.net/bug.php?id=14134 を見つけた

といった流れです。参考になりましたでしょうか?

(*1) http://www.php.net/manual/ja/language.types.integer.php
(*2) http://www.php.net/manual/ja/language.types.type-juggling.php
(*3) http://www.php.net/manual/ja/language.types.php

-- 
高木 正弘 mailto:matakagi @ osk2.3web.ne.jp


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