Bug #16366 Updated: bit shifting error

From: Date: Sun, 31 Mar 2002 20:32:24 +0000
Subject: Bug #16366 Updated: bit shifting error
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-3701@lists.php.net to get a copy of this message
ID: 16366 Updated by: msopacua@idg.nl Reported By: adam@adeptsoftware.com Status: Open Bug Type: Math related Operating System: WinXP PHP Version: 4.1.2 New Comment: Actually - the echo(11>>34) issue, is somewhat expected behavior. What happens, is that it returns 11>>2 (34 - 32) - BUT only on a 32-bit system. I just checked at an AIX 64-bit system, and there echo(11>>34) gives 0 And anything above 64-bit is than equal to $int>>($shift % 64). Maybe it should be added to the bitwise operators documentation. <?php print("32 bits test\n"); $int=11; for ($shift=31;$shift<35;$shift++) { print("$shift: "); $check=$int>>$shift; print($check); print("\n\n"); } print("64 bits test\n"); for($shift=63;$shift<67;$shift++) { print("$shift: "); $check=$int>>$shift; print($check); print("\n"); } ?> On a 64-bit system produces: $ php -f test.php 32 bits test 31: 0 32: 0 33: 0 34: 0 64 bits test 63: 0 64: 11 65: 5 66: 2 On a 32-bit system produces: 32 bits test 31: 0 32: 11 33: 5 34: 2 64 bits test 63: 0 64: 11 65: 5 66: 2 Previous Comments: ------------------------------------------------------------------------ [2002-03-31 13:42:14] adam@adeptsoftware.com Just a reminder of the original issue: echo (11>>34) produces "2" This is not a documentation problem, unless you want to write that shifting greater than 32 has incorrect results. ------------------------------------------------------------------------ [2002-03-31 13:39:23] daniel@php.net are you sure? there is already a bunch of reports on "floating-point bugs" in PHP. That's why I didn't reopen it. ------------------------------------------------------------------------ [2002-03-31 13:38:51] adam@adeptsoftware.com Well I have 200 groups of 64 on/off's.. I can name the 200 bigint groups but there is no way in hell I am going to name 12,800 bools, not to mention that they would take up 8x more space in the database.. Each group has the same structure - somebody needs to write a DB that uses structures as custom fields. This may be the way they work but this is ancient design - I was surprised as hell when I started learning MySQL and realized that they are still doing things this way. But anyway. Now I am thinking "char binary" since it can be fixed size, but the documentation on PHP's conversions of MySQL is sparse. If someone would like to pursue this in private email please write. The original bug was about bit shifting, which I don't think would involve a conversion to float.. unless PHP is doing something weird. It looks like someone is just not expecting a shift greater than 32. ------------------------------------------------------------------------ [2002-03-31 13:27:30] sander@php.net Good point. Reopening as documentation problem. ------------------------------------------------------------------------ [2002-03-31 13:23:52] msopacua@idg.nl Related to the bug only: <?php $int=2; for($i=25;$i<33;$i++) { $check=pow($int, $i); $check2=(int)$check; $check2 += 1; $check3=(int)$check; $check3 -= 1; echo("i is $i\n"); var_dump($check); var_dump($check2); var_dump($check3); echo("\n"); } ?> Gives some weird results: $ ./test_float_conversion.php i is 25 int(33554432) int(33554433) int(33554431) i is 26 int(67108864) int(67108865) int(67108863) i is 27 int(134217728) int(134217729) int(134217727) i is 28 int(268435456) int(268435457) int(268435455) i is 29 int(536870912) int(536870913) int(536870911) i is 30 int(1073741824) int(1073741825) int(1073741823) i is 31 float(2147483648) int(-2147483647) float(-2147483649) i is 32 float(4294967296) int(1) int(-1) I guess the manual should be appended, in the 'typecasting' section, to not cast to integer, when it's larger than 2^30 and that those numbers are automatically converted to floats. (http://www.php.net/manual/en/language.types.type-juggling.php#language.types.typecasting) ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/16366 -- Edit this bug report at http://bugs.php.net/?id=16366&edit=1

« previous php.bugs (#3701) next »