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

Reply via email to