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