On Sat, 19 Nov 2011 13:46:35 -0000, Paul Dragoonis <dragoo...@gmail.com> wrote:

[...]

---- CODE ---
$s = "2433078805";
var_dump($s);
var_dump((int) $s); exit;

----- EXPECTED -----
string(10) "2433078805" int(2433078805)

----- ACTUAL -----
string(10) "2433078805" int(2147483647)



Anthony has already explained the problem, but I can't find this documented anywhere. The manual says a conversion from a float outside the integer boundaries results in undefined behavior ( http://php.net/manual/en/language.types.integer.php#language.types.integer.casting ) and that "if the string does not contain any of the characters '.', 'e', or 'E' and the numeric value fits into integer type limits (as defined by PHP_INT_MAX), the string will be evaluated as an integer. In all other cases it will be evaluated as a float." ( http://php.net/manual/en/language.types.string.php#language.types.string.conversion ). None of these seems to apply here, though perhaps from combining the two we could conclude the behavior is undefined.

Internally, the behavior is also not explicitly laid out; it follows from the behavior of strol. This adds a notice:

Index: Zend/zend_operators.c
===================================================================
--- Zend/zend_operators.c       (revision 319548)
+++ Zend/zend_operators.c       (working copy)
@@ -353,7 +353,11 @@
                        {
                                char *strval = Z_STRVAL_P(op);

+                               errno = 0;
                                Z_LVAL_P(op) = strtol(strval, NULL, base);
+                               if (errno == ERANGE) {
+ zend_error(E_NOTICE, "Value outside integer bounds");
+                               }
                                STR_FREE(strval);
                        }
                        break;



--
Gustavo Lopes

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to