Bug #14134 Updated: Literal -2147483648 should be an int, not a double.
| From: | at217 at chebucto dot ns dot ca | Date: | Mon, 26 Nov 2001 19:35:09 +0000 |
| Subject: | Bug #14134 Updated: Literal -2147483648 should be an int, not a double. | ||
| References: | 1 | Groups: | php.dev |
| Request: | Send a blank email to php-dev+get-71706@lists.php.net to get a copy of this message | ||
ID: 14134
User updated by: at217@chebucto.ns.ca
Reported By: at217@chebucto.ns.ca
Status: Analyzed
Bug Type: Scripting Engine problem
Operating System: Linux
PHP Version: 4.0.6
Old Assigned To: derick
Assigned To:
New Comment:
Derick,
Can you tell me where this code is so I can have a look? I'm a little confused about your
comment about conversion to unsigned integers. First, I believe strtol converts to a signed integer
(and, as used in intval, it does work correctly). But 2147483648 actually is a valid unsigned long.
If the conversion is failing, it must be trying to convert to a signed integer.
As for the workaround, creating constants INT_MIN and INT_MAX is exactly what I did, although you
still have to be careful when creating INT_MIN. It must be something like:
define( "INT_MIN", -2147483647 - 1 );
define( "INT_MAX", 2147483647 );
Previous Comments:
------------------------------------------------------------------------
[2001-11-26 02:37:19] derick@php.net
Ok, as I have no time to look into a fix (if it's even do-able), I'll explain here why it
happens:
The parser embedded in PHP, does not take "-2147483648" as a string to convert (with
strtol) to a unsigned integer, but it instead does this:
1. it tries to convert "2147483648" to a unsigned integer (which fails)
2. it tries to substract this from 0, ie. 0 - 2147483648.
Because the conversion to a unsigned long fails in the first step, it gets converted to a floating
point number, which is substracted from 0.
A way to solve this can be to add constants for these outher limits, ie. INT_MIN (for -2147483648)
and INT_MAX (for 2147483647).
Derick
------------------------------------------------------------------------
[2001-11-20 03:31:18] derick@php.net
Found the problem. I'll try to make a fix this evening.
Derick
------------------------------------------------------------------------
[2001-11-20 03:02:55] derick@php.net
Checking this out
------------------------------------------------------------------------
[2001-11-20 02:34:05] at217@chebucto.ns.ca
When assigning the value -2147483648 to a variable, the variable becomes a double, even though the
value is within the range of integers. In fact, assigning -2147483647 - 1 works, as does using
intval("-2147483648").
The following script demonstrates, and can be accessed at <http://www.randomsample.org/tests/test-int-min.php>.
<?php
$int_max = 2147483647;
$int_min = -2147483648;
$int_min_alt = -2147483647 - 1;
?>
<html><head><title>Test INT_MIN</title></head>
<body>
<p>Type of "2147483647": <?php echo gettype( $int_max ); ?>
(value = <?php echo $int_max; ?>)</p>
<p>Type of "-2147483648": <?php echo gettype( $int_min ); ?>
(value = <?php echo $int_min; ?>)</p>
<p>Type of "-2147483647 - 1": <?php echo gettype( $int_min_alt ); ?>
(value = <?php echo $int_min_alt; ?>)</p>
</body>
</html>
This is an ISP-provided build, but the configure line from phpinfo() is:
'./configure' '--with-config-file-path=/etc' '--enable-safe-mode=yes'
'--enable-force-cgi-redirect=yes' '--with-gdbm' '--with-mysql'
'--with-exec-dir=/www/cgi-bin' '--bindir=/www/cgi-bin' '--enable-ftp'
'--enable-trans-sid' '--with-gd=/usr' '--with-zlib=/usr'
'--with-jpeg-dir=/usr' '--enable-gd-native-ttf' '--with-png-dir=/usr'
'--with-ttf=/usr/lib'
------------------------------------------------------------------------
Edit this bug report at http://bugs.php.net/?id=14134&edit=1