比較運算符
回答
的八進制表示這是因爲字符串到數字的轉換在PHP是基於一些古老的C函數 - strtod
。和它的規則爲follows:
串(的初始部分)的預期形式是可選 前導空白由isspace(3),可選的加 (「+」)或減去作爲識別號(「 - 」),然後或者(ⅰ)一個十進制數,或 (ⅱ)的十六進制數[...]
的十進制數由十進制數字 可能含有一個基數字符非空序列的(小數點, 區域設置相關,通常爲'。'),可選的是後跟小數點 指數。十進制指數由一個'E'或'e'組成,後面跟着一個可選的加號或減號 ,後面跟着一個非空序列 十進制數字,並表示乘以10的冪。[...]
十六進制數由「0x」或「0X」,隨後的可能含有一個基數字符十六進制數字的非空子 序列, 任選地隨後通過二進制指數。 [...]
如您所見,'1e1'字符串具有非空序列'1',後跟小數指數'e1'。因此,它會被轉換成十進制數 - 並變爲10.
「0x1A的」字串遵循用於十六進制數的規則,並且將相應地轉化成26。但是由於沒有關於十八進制數字的具體規則,所以'042'將被轉換爲普通小數 - 並且變成42.這當然不等於34。
這不應與數字文字如何由PHP本身解析相混淆。以0開頭的數字文字被認爲代表十進制數字。因此,intval(042)
與intval(34)
基本相同 - 但與intval("042")
不同。
有趣,感謝分享。這意味着二進制文字也沒有被正確轉換。 – rodion
很高興看到某種真實的原因,並將一個恰當的解釋放入一次+1的答案中。 – DaveRandom
我不知道所有的數學魔神但是,
因爲前兩個例子是清楚你正在嘗試做的..它轉換爲指數,並將其轉換爲十六進制。 但第三個解決方案是不是你在做什麼明確的,所以它轉換爲42 想想其他方式.. 您試圖solvve問題,由於某種原因,「042」不等於42。你會很困惑
因此,使用你所需要的,如果你需要的042,然後轉換爲int一個int表示,但如果它是一個字符串,不要指望它的工作的方式。
那怎麼PHP
卷。這是因爲當你指定一個字符串轉換,它被轉換爲數字,你的情況,第一1e1
意味着1 exponent 1
,該0x1A
是十六進制表示的最後一份042
本身是一個數字,它被轉換爲42
但intval(042)
手段34.整數
我想這裏真正的問題是:爲什麼隱式轉換方面的基數16(用0x開頭的字符串表示),但不尊重基數8(用以零開頭的字符串表示)? – rodion
@rodion因爲PHP很煩人而且不一致。我肯定會有一些無意義的理由被深埋在PHP/FI的沙地中。 – DaveRandom
因爲我認爲很多人會爲了「042」!= 42而感到困惑並提交bug。用0x和e表示清楚它在做什麼。 – Kris
- 1. 比較運算符
- 2. 比較運算符
- 3. 重載比較運算符
- 4. 多個比較運算符
- 5. PowerShell比較運算符
- 6. TypeTag和比較運算符?
- 7. 比較運算符!==對0
- 8. 比較位運算符
- 9. Python比較運算符
- 10. 比較運算符問題
- 11. 邏輯比較運算符
- 12. SQL比較運算符
- 13. Ruby比較運算符? ==與===
- 14. JavaScript的比較運算符
- 15. 運算符重載「運算符T *()」產生比較運算符?
- 16. 比較運算
- 17. C字符串的比較運算符
- 18. JPQL比較運算符的佔位符
- 19. Lua比較運算符(通配符?)
- 20. 符號的比較運算符
- 21. 組合比較運算符(<=>)和空合併運算符(??)組合左右比較運算符
- 22. javascript的字符串比較和比較運算符不工作?
- 23. 使用比較運算符比較postgres中的字符串?
- 24. Javascript:使用邏輯運算符與比較運算符
- 25. 在c + +運算符重載(比較運算符)
- 26. 比較運算符和邏輯運算符有什麼區別?
- 27. angularjs比較運算符函數
- 28. 哪個比較運算符是* =
- 29. 正確使用比較運算符
- 30. HLSL:浮法賦值運算符比較
'var_dump(intval(042)== 34);'作品桃色 – Kermit
[類型問題](http://codepad.viper-7.com/WM1kgX)! – DaveRandom