#36325 [Opn->Csd]: Hexadecimal numbers above LONG_INT do convert to floats
| From: | vrana@php.net | Date: | Tue, 07 Mar 2006 00:49:48 +0000 |
| Subject: | #36325 [Opn->Csd]: Hexadecimal numbers above LONG_INT do convert to floats | ||
| References: | 1 | Groups: | php.doc |
| Request: | Send a blank email to phpdoc+get-969372270@lists.php.net to get a copy of this message | ||
ID: 36325
Updated by: vrana@php.net
Reported By: paul dot biggar at gmail dot com
-Status: Open
+Status: Closed
Bug Type: Documentation problem
Operating System: Ubuntu dapper (Linux 2.6.15)
PHP Version: Irrelevant
New Comment:
This bug has been fixed in the documentation's XML sources. Since the
online and downloadable versions of the documentation need some time
to get updated, we would like to ask you to be a bit patient.
Thank you for the report, and for helping us make our documentation
better.
Previous Comments:
------------------------------------------------------------------------
[2006-02-07 21:55:37] paul dot biggar at gmail dot com
Description:
------------
This is related to bug 32211. The fix specified a documentation fix was
required. It seems that this should be fixed in the code base, so that
hexadecimal and decimal integers behave identically. Regardless, the
documentation doesn't completely describe the behaviour below.
Description:
The manual (http://ie2.php.net/int#language.types.integer.overflow)
implies that hexadecimal integers above 2147483647 do not get converted
to a float, but rather, are truncated to an int.
In actual fact, only numbers above 0x100000000 get truncated.
Hexadecimal numbers between 0x80000000 and 0xffffffff are converted to
floats, in the same way as if they had been specified in decimal.
Reproduce code:
---------------
echo "\nHexdecimal ints near ULONG_MAX(truncated to
int(LONG_MAX) after ULONG_MAX)\n";
echo "0xfffffffd\t= "; var_dump(0xfffffffd);
echo "0xfffffffe\t= "; var_dump(0xfffffffe);
echo "0xffffffff\t= "; var_dump(0xffffffff);
echo "0x100000000\t= "; var_dump(0x100000000);
echo "0x100000001\t= "; var_dump(0x100000001);
echo "0x100000002\t= "; var_dump(0x100000002);
echo "\nDecimal ints near ULONG_MAX(floats as far as the eye
can see)\n";
echo "4294967293\t= "; var_dump(4294967293);
echo "4294967294\t= "; var_dump(4294967294);
echo "4294967295\t= "; var_dump(4294967295);
echo "4294967296\t= "; var_dump(4294967296);
echo "4294967297\t= "; var_dump(4294967297);
echo "4294967298\t= "; var_dump(4294967298);
Expected result:
----------------
Hexdecimal ints near ULONG_MAX(truncated to int(LONG_MAX) after
ULONG_MAX)
0xfffffffd = float(4294967293)
0xfffffffe = float(4294967294)
0xffffffff = float(4294967295)
0x100000000 = float(4294967296)
0x100000001 = float(4294967297)
0x100000002 = float(4294967298)
Decimal ints near ULONG_MAX(floats as far as the eye can see)
4294967293 = float(4294967293)
4294967294 = float(4294967294)
4294967295 = float(4294967295)
4294967296 = float(4294967296)
4294967297 = float(4294967297)
4294967298 = float(4294967298)
Actual result:
--------------
Hexdecimal ints near ULONG_MAX(truncated to int(LONG_MAX) after
ULONG_MAX)
0xfffffffd = float(4294967293)
0xfffffffe = float(4294967294)
0xffffffff = float(4294967295)
0x100000000 = int(2147483647)
0x100000001 = int(2147483647)
0x100000002 = int(2147483647)
Decimal ints near ULONG_MAX(floats as far as the eye can see)
4294967293 = float(4294967293)
4294967294 = float(4294967294)
4294967295 = float(4294967295)
4294967296 = float(4294967296)
4294967297 = float(4294967297)
4294967298 = float(4294967298)
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=36325&edit=1