php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #4254 32 bit integer support misbehaving in general
Submitted: 2000-04-26 18:06 UTC Modified: 2000-12-19 06:36 UTC
From: ctsmhn at cts dot com Assigned:
Status: Closed Package: Scripting Engine problem
PHP Version: 4.0 Release Candidate 1 OS: FreeBSD 4.0
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: ctsmhn at cts dot com
New email:
PHP Version: OS:

 

 [2000-04-26 18:06 UTC] ctsmhn at cts dot com
Try something like this:

$var1 = 0x7FFFFFFF;
$var2 = 0xFFFFFFFF;
$var3 = 0x8FFFFFFF;
$var4 = 0x9FFFFFFF;
$var5 = 0x8FFFFFF1;
$var6 = 0x80000001;
$var7 = $var1 + 0x7FFFFFFF;
$var8 = (0x08FFFFFF << 4);
$var9 = intval("AFFFFFFF", 16);
echo $var1; echo "\n";
echo $var2; echo "\n";
echo $var3; echo "\n";
echo $var4; echo "\n";
echo $var5; echo "\n";
echo $var6; echo "\n";
echo $var7; echo "\n";
echo $var8; echo "\n";
echo $var9; echo "\n";

Results:

2147483647
0
0
0
0
0
4294967294
-1879048208
2147483647

("\n" is separated so we don't accidentally cause the interpreter to convert the vars to strings before printing them)

var1 prints out (correctly) 2147483647

var2 prints out 0, leading me to believe that PHP deals with integers as signed 32-bit, by default (even though FFFFFFFF should be -1, not 0).  However, if that's the case, var4 through var6 should print out some version of a negative number.  Instead they print out 0 as well.

Then, looking at var7, we see that you *can* assign and print a value greater than 7FFFFFFF in unsigned mode, *if* you add to it to increment the value to that size, as opposed to directly assigned it using the '0x' operator.  However, var8 shows that shifting left doesn't afford the same 'convenience'.

Using intval doesn't help either.  As you can see from var9, not only does intval not translate AFFFFFFF to the proper unsigned 32 bit integer, it doesn't even translate it to the proper signed 32 bit integer!  In fact, it's as if the 32nd bit is forcibly turned off - *any* hex number beyond 7FFFFFFF is returned by intval as 2147483647.

At the very least all of these operations should have consistent behavior.  Preferably there would be a way to specify signed or unsigned operations as well.  And it would be *really* nice to have an unsigned type.

./configure --with-apache=../apache_1.3.12i --enable-sysvsem --enable-sysvshm --enable-wddx --enable-xml --with-pgsql=/usr/local/postgres --enable-track-vars --enable-trans-sid --enable-session


Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2000-07-24 16:37 UTC] derick@php.net
I tried it here and got the folowing results (with 4.0.1pl2):

2147483647
1.9999999995343
1.1249999995343
1.2499999995343
1.1249999930151
1.0000000004657
4294967294
-1879048208
2147483647

It's very strange, $var2 to $var5 are suddenly floating point numbers.

Zeev, Andi? Could someone tell what's going on here?
 [2000-07-24 16:43 UTC] stas@php.net
Well, 0x doesn't work too good in current PHP version. This should be fixed.
 [2000-08-23 08:26 UTC] sniper@php.net
Have you tried recent versions of php4 
(from CVS or http://snaps.php.net/ ) ???

--Jani
 [2000-08-23 21:40 UTC] sniper@php.net
I think the user misunderstood Stas's comment. (I did too..)
It should be fixed but it hasn't been fixed yet. 

I tried this myself with the latest CVS and got the same results as derick.

--Jani
 [2000-11-19 06:48 UTC] stas@php.net
Please try latest version and report if it works.

 [2000-12-19 06:36 UTC] stas@php.net
Should work now, no feedback - closing. Reopen if it's still
problematic.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu May 02 07:01:30 2024 UTC