ID: 30970
Updated by: [EMAIL PROTECTED]
Reported By: wboring at qualys dot com
-Status: Open
+Status: Closed
Bug Type: Scripting Engine problem
Operating System: linux
PHP Version: 5.0.2
New Comment:
Yes PHP supports 32-bit ints, but the higest bit is a sign, so the
largest meaningful int *IS* 0x7FFFFFFF, after that the number must be
expressed as a float, attempting to express as a long results in
"undefined behavior".
5.0.2 introduced a patch to truncate float to lval conversion to no
more than 0x7FFFFFFF. Don't worry, it's been reverted. Take a look at
5.0.3RC1 or a snapshot from snaps.php.net
Previous Comments:
------------------------------------------------------------------------
[2004-12-03 01:36:34] wboring at qualys dot com
If I do a simple var_dump( 0x80000000 ); in php4 and 5 I get the same
result of float(2147483648).
If I try and do something like
$n ^= 0x80000000; //to flip the high bit, then it breaks.
<?php
$n = -1979053311;
var_dump( sprintf('%32b',$n).' '.$n);
$n ^= 0x80000000; // flip the high (sign) bit
var_dump( sprintf('%32b',$n).' '.$n );
?>
php4.3.9 :
string(45) "10001010000010100000101100000001 -1979053311"
string(43) " 1010000010100000101100000001 168430337"
php5.0.2 :
string(32) "10001010000010100000101100000001 -1979053311"
string(44) "11110101111101011111010011111110 -168430338"
------------------------------------------------------------------------
[2004-12-03 00:46:39] wboring at qualys dot com
Description:
------------
If I set an integer to a value of 0x80000000, it works properly in
php4, but in php5 the value becomes 0x7FFFFFFF.
My configure line:
./configure \
--with-oci8=/u01/app/oracle/product/8.1.7 \
--enable-sigchild \
--with-mcrypt \
--with-gd \
--with-png-dir=/usr \
--with-jpeg-dir=/usr \
--with-zlib-dir=/usr \
--enable-sysvsem \
--enable-sysvshm \
--enable-shmop \
--with-xml \
--with-zlib \
--with-gdbm \
--with-dom \
--with-curl=/usr \
--with-mysql=/usr \
--enable-mbstring \
--enable-tokenizer \
--enable-sockets \
--with-kerberos=/usr/kerberos \
--with-openssl \
--disable-cgi \
--with-xsl \
--with-bz2 \
--with-mhash \
--enable-soap \
--with-flatfile \
--with-inifile \
--with-curlwrappers \
--with-apxs=/usr/local/apache/bin/apxs
Reproduce code:
---------------
<?php
$n = 0x80000000;
printf('%b', $n);
?>
Expected result:
----------------
php4.3.9: 10000000000000000000000000000000
php5.0.2: 10000000000000000000000000000000
Actual result:
--------------
php4.3.9: 10000000000000000000000000000000
php5.0.2: 1111111111111111111111111111111
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=30970&edit=1