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