[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