#50080 [Bgs]: 1 bit short of an 8 byte integer

From: Date: Thu, 05 Nov 2009 01:56:02 +0000
Subject: #50080 [Bgs]: 1 bit short of an 8 byte integer
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-144282@lists.php.net to get a copy of this message
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@php.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@php.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

« previous php.bugs (#144282) next »