#25877 [Bgs]: >> operator bug for negative LOP

From: Date: Wed, 15 Oct 2003 16:57:34 +0000
Subject: #25877 [Bgs]: >> operator bug for negative LOP
References: 1  Groups: php.doc 
Request: Send a blank email to phpdoc+get-969356608@lists.php.net to get a copy of this message
ID: 25877 User updated by: cestmirl at freeside dot sk Reported By: cestmirl at freeside dot sk Status: Bogus Bug Type: Documentation problem Operating System: Linux Debian, Win32 PHP Version: 4.3.3 New Comment: You're right, it's the same semantics as GCC or Java has for signed int (though I've never experienced this yet as I've raised in Pascal world...). However, in this case, I think it's worth considering to implement Java unsigned shift ops (<<<, >>>) in PHP. Of course, there's no problem to mask out appropriate number of bits from left after making "signed shift" right, but standard operator would be much cleaner solution. Previous Comments: ------------------------------------------------------------------------ [2003-10-15 11:54:01] jay@php.net This is expected. (1 << 31) wraps the 32-bit integer limit, and I believe this behaviour is undefined, at least in C and C++. If you run the same code in C or C++, the result is the same as what you're experiencing. J ------------------------------------------------------------------------ [2003-10-15 08:00:22] moriyoshi@php.net Heh, who told me that C supports '>>>' operator... there's no such operator in that language. ------------------------------------------------------------------------ [2003-10-15 07:56:56] moriyoshi@php.net Since PHP doesn't support unsigned shift operations that are represented by '<<<' or '>>>' in the C language, bit shift operations are done in "sign-respectful" manner, where the most significant bit will never be changed. This is expected behaviour, but not documented yet. ------------------------------------------------------------------------ [2003-10-15 07:40:14] cestmirl at freeside dot sk Description: ------------ Bitwise shift right operator returns negative result (most significant bit set) for negative input (left operand). Following assert fails (though should NOT) assert((1 << 31 >> 31) == 1); Reproduce code: --------------- assert((1 << 31 >> 31) == 1); Actual result: -------------- assertion failed ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=25877&edit=1

« previous php.doc (#969356608) next »