3

このリンクを参照してください。

文字列型のオペランドが数値に変換され、次に通常の数学になることを知っています

ただし、次のサンプルコードを参照してください。

echo intval(1e1);       // 10
var_dump("1e1" == 10);  // true, and it's ok

echo intval(0x1A);      // 26
var_dump("0x1A" == 26); // true, and it's ok

echo intval(042);       // 34
var_dump("042" == 34);  // fasle, Why ?!!!

最後のコードがfalseを返す理由。

4

3 に答える 3

9

これは、PHPでの文字列から数値への変換が、いくつかの古いC関数に基づいているためです- strtod。そして、そのルールは次のとおりです。

文字列(の最初の部分)の予想される形式は、isspace(3)で認識されるオプションの先頭の空白、オプションのプラス('+')またはマイナス記号('-')、および(i)10進数です。 、または(ii)16進数[...]

10進数は、基数文字(小数点、ロケール依存、通常は「。」)を含む可能性のある空でない10進数のシーケンスで構成され、オプションで10進数の指数が続きます。10進数の指数は、「E」または「e」、オプションのプラスまたはマイナス記号、空でない10進数のシーケンスで構成され、10の累乗による乗算を示します。[...]

16進数は、「0x」または「0X」の後に、基数文字を含む可能性のある空でない16進数のシーケンスと、オプションで2進数の指数で構成されます。[...]

ご覧のとおり、「1e1」文字列には空でないシーケンス「1」とそれに続く10進指数「e1」があります。したがって、10進数に変換されて10になります。

'0x1A'文字列は、16進数の規則に従い、それに応じて26に変換されます。ただし、8進数には特定の規則がないため、「042」は単純な10進数に変換されて42になります。もちろん、これは34に等しくありません。

これを、PHP自体による数値リテラルの解析方法と混同しないでください。0で始まる数値リテラルは、8進数を表すと見なされます。したがって、intval(042)本質的にはintval(34)-と同じですが、とは異なりintval("042")ます。

于 2012-09-17T23:00:30.657 に答える
3

それがPHP転がる方法です。これは、文字列を指定して変換すると、数値に変換されるためです。この場合、最初の1e1意味1 exponent 10x1A16進表現で、最後の部分042自体は数値であり、整数34の8進表現に42変換されます。intval(042)

于 2012-09-17T22:54:08.390 に答える
1

私はすべての数学の巨大なジャンボを知りませんが、

最初の2つの例は、何をしようとしているのかが明確であるため、指数に変換し、16進数に変換します。しかし、3番目の解決策はあなたが何をしているのか明確ではないので、それを42に変換します。別の方法で考えてください。あなたは問題を解決しようとしていますが、何らかの理由で「042」は42と等しくありません。非常に混乱

したがって、必要なものを使用します。042のint表現が必要な場合は、intにキャストしますが、文字列の場合は、そのように機能することを期待しないでください。

于 2012-09-17T22:53:39.093 に答える