php-documentation-list | 2003101

[PHP-DOC] #25877 [Bgs]: >> operator bug for negative LOP From: cestmirl at freeside dot sk (phpdoc <email protected>)
Date: 10/15/03

 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 <email protected>

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 <email protected>

Heh, who told me that C supports '>>>' operator... there's no such
operator in that language.

------------------------------------------------------------------------

[2003-10-15 07:56:56] moriyoshi <email protected>

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