めのん@ひとりプログラミング同好会

このブログはすべてフィクションであり、実在の人物、団体とは一切関係ありません

PHPの暗黙の型変換は罠ですねー

こんばんは、めのんです!

PHPを勉強し始めて、最初のうちはPHPの文法がCによく似ていることもあってスラスラ理解できている気になっていました。

ところがやっぱりPHPとCは別の言語ですねー

当たり前のことなんですが、Cと同じつもりで書いていると全然うまくいきません。 何が一番難しかったかというと、演算結果の値によって型が変わるというところです。

Cだったら最初に変数の型を宣言するので、そんなことはあり得ません。 もちろん、演算途中で「整数拡張」とか「浮動小数点拡張」とか「通常の算術型変換」といった暗黙の型変換が起きることはありますが、演算結果の型によって決まるなんてことはありません。 あくまでも演算に使ったオペランドの型によって結果の型も決まるのです。

ところがPHPはそうじゃないっていうんです!

具体的には、int型どうしの算術演算でオーバーフローが起きた場合はfloat型になるといいます。 オーバーフローしたんだから仕方がない気もしますが、int型からfloat型に型変換されると精度が落ちるんですよ。

2の累乗を法とする剰余を求めたい場合って結構ありますよね。 法が2の累乗でなくても、モジュラー算術って使うことが多いと思うんですよ。 それなのに、2の累乗の剰余を求めようとして & 演算子を使おうとしたら、勝手にfloat型になっていて使えないんですよ! % 演算子で剰余を求めようと思っても、精度が足りなくて下位の桁がなんだかわからなくなっているし、fmod関数を使ってももちろん何の解決にもなりません。

整数どうしの徐算はとくにきついですね。 割り切れたかどうかで型が変わるというのはすごい仕様だと思います。

32ビットの環境だともう少しマシなんでしょうか? それでも、整数どうしの徐算はどうしようもないですよね。

なんか今回は愚痴っぽくなってしまいましたが、私が慣れていないだけかもしれません。 いえ、きっとそうでしょう。 そういうことにしておきます!

そえでは!!