#50080 [Bgs]: 1 bit short of an 8 byte integer
by Aidevelopment At Gmail Dot Com other posts by this author
Nov 4 2009 6:00PM messages near this date
#50080 [NEW]: 1 bit short of an 8 byte integer
|
#50080 [Opn->Bgs]: 1 bit short of an 8 byte integer
ID: 50080
User updated by: aidevelopment at gmail dot com
Reported By: aidevelopment at gmail dot com
Status: Bogus
Bug Type: Variables related
Operating System: Linux 2.6.15-26-server
PHP Version: 5.2.11
New Comment:
Hi Jani,
Thanks for the update. Please, allow me to clarify my last post.
With the information you've given, we know the 64th bit (far left), is
reserved for sign.
With a simple two line script, we can see that 0 = positive, therefore
1 = negative.
//determine positive vs. negative (observe far left bit).
$a=5;
printf("a = '%b'", $a);
The example below will show the difference between actual expected
result when increasing integers past the maximum value of an unsigned
int.
//set a equal to the max
$a = 0x7FFFFFFFFFFFFFFF;
//add one
$a++;
//Expecting a variable wrap here. e.x. $a = -0x7FFFFFFFFFFFFFFF
//Actual result is $a = negative 0
printf("a = '%b'", $a);
//add one
$a++;
//Given a is now actually equal to negative 0
//Expecting a = 1;
//Actual result is $a = negative 0 (unchanged).
printf("a = '%b'" ,$a);
I would appreciate if you would explain how giving the incorrect answer
to a simple mathematical formula (x+1) is not a bug. If this is in fact
a bug, please re-open, reassign and/or recategorize this bug
appropriately. Thanks!
Cheers!
Steve
Previous Comments:
------------------------------------------------------------------------
[2009-11-04 22:51:22] jani@[...].net
No.
------------------------------------------------------------------------
[2009-11-04 17:59:05] aidevelopment at gmail dot com
I understand what you are saying. However, the handling is very
difficult to understand. As you can see, adding 1 simply has no effect
past positive 0
(1000000000000000000000000000000000000000000000000000000000000000). I
have not been able to determine yet exactly what happens when you
explicitly assign a variable to a value "too large".
Is there no way to have PHP utilize 64 bit values (uint64)?
------------------------------------------------------------------------
[2009-11-04 17:17:58] sjoerd@[...].net
In a 64 bit integer, 1 bit indicates the sign and 63 bits are left for
the number. Thus the range is from -2^63 to 2^63, giving 2^64 numbers.
------------------------------------------------------------------------
[2009-11-04 16:14:21] aidevelopment at gmail dot com
Description:
------------
Despite having PHP_INT_MAX set to 8 bytes, It is impossible to have an
int greater than
1000000000000000000000000000000000000000000000000000000000000000.
8 Byte, or 64 bit maximum should be
1111111111111111111111111111111111111111111111111111111111111111.
In my included example, it is clear that when attempting to increase
the value above(by adding 1), simply nothing happens.
Attempting to assign a variable to a number greater than the above
number produces unpredictable results.
Reproduce code:
---------------
<?php
echo "Int Size = ".PHP_INT_SIZE." bytes.<br> ";
$status = 0x7FFFFFFFFFFFFFFF;
for($i=0;$i<=4;$i++)
{
printf ("status = '%b'<br> ", $status);
$status++;
}
?>
Expected result:
----------------
Int Size = 8 bytes.
status =
'111111111111111111111111111111111111111111111111111111111111111'
status =
'1000000000000000000000000000000000000000000000000000000000000000'
status =
'1000000000000000000000000000000000000000000000000000000000000001'
status =
'1000000000000000000000000000000000000000000000000000000000000010'
status =
'1000000000000000000000000000000000000000000000000000000000000011'
Actual result:
--------------
Int Size = 8 bytes.
status =
'111111111111111111111111111111111111111111111111111111111111111'
status =
'1000000000000000000000000000000000000000000000000000000000000000'
status =
'1000000000000000000000000000000000000000000000000000000000000000'
status =
'1000000000000000000000000000000000000000000000000000000000000000'
status =
'1000000000000000000000000000000000000000000000000000000000000000'
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=50080&edit=1
Thread:
Aidevelopment At Gmail Dot Com
Aidevelopment At Gmail Dot Com
jani
Aidevelopment At Gmail Dot Com
sjoerd
|