[PHP-users 1268] PHPのint境界とfloatへの型変換

S.Sugichan php-users@php.gr.jp
Sun, 19 Aug 2001 22:12:19 +0900


杉山です。

ちょっと長くてすいません。

今まで判っていることとして

坂内さんのQuick Hackの結果から
$i=$i+1;
と
$i++;
又
$i=$i-1;
と
$i--;

では
int境界(2147483647を越えたとき、-2147483648より減ったとき)において動き
が変わると言うことでした。

説明として、坂内さんのコードをそのまま流用させていただきます(文末参照)

又、坂内さんのQuick Hackから、++、--時の型変換をするdiffにより理解を深め
ることが出来ました。

田中さんが言われているように、確かにC言語だろうがJavaだろうが(Javaは経
験無いので想像ですが)上限下限に対しては内包してる問題ですね。

ただCの場合コンパイルという手順を踏むため、以下のソースですと、ワーニン
グを出してやばいんじゃないのと促してくれますよね?(参照部:参照)


自分の結論からすると、今回話したようなコードを書くことは滅多に無い事だと
思いますが、PHPでは、暗黙に型変換が行われるため、坂内さんのQuick Hack
のように++や--も暗黙の型変換をした方が理にかなっているような気がします。

++や--動きとしてはみなさんどう思われるでしょうか?

#アセンブラ時代を振り返るとincは早い命令でした。
#そんな名残もあるんでしょうか?

参照部:

+1後型が変わる例:
% cat foo
#!/usr/local/bin/php -f
<?php

    $i = 0x7fffffff;
    print var_dump( $i );
    $j = $i+1;
    print var_dump( $j );

    $i = 0x80000000;
    print var_dump( $i );  
?>
% ./foo
int(2147483647)
float(2147483648)
float(2147483648)

+1後型が変わらない例:
% cat hoge
#!/usr/local/bin/php -f
<?php

    $i = 0x7fffffff;
    print var_dump( $i );
    $i++;
    print var_dump( $i );
?>
% ./hoge
int(2147483647)
int(-2147483648)



Cのサンプル:
#include <stdio.h>
main()
{
 int i;
 for(i=2147483640;i<2147483649;i++)
 {
  printf("%d\n",i);
  sleep(1);
 }
}

Cのワーニング:
loop.c:5: warning: decimal constant is so large that it is unsigned

S.Sugichan
Mail: sugichan@tkd.att.ne.jp