strange bit-shifting

Andriy Gapon avg at icyb.net.ua
Wed Apr 4 08:38:05 UTC 2007


on 03/04/2007 21:02 Stefan Farfeleder said the following:
> On Tue, Apr 03, 2007 at 08:22:15PM +0300, Andriy Gapon wrote:
[...]
>> $ ./test_shl
>> FFFFFFFFFFFFFFFF
>> FFFFFFFFFFFFFFFF
>> $ uname -srm
>> FreeBSD 6.2-RELEASE-p2 amd64
>> $ gcc -v
>> Using built-in specs.
>> Configured with: FreeBSD/amd64 system compiler
>> Thread model: posix
>> gcc version 3.4.6 [FreeBSD] 20060305
>>
>> What gives ? It looks like shift is actually done not by specified
>> number of bits but by that number modulo 64.
>> Please also mind that the same thing happens if I use a variable instead
>> of a constant in that expression.
> 
> The behaviour is undefined and you even got a warning from GCC.
> 
> C99 6.5.7:
> 
> # The integer promotions are performed on each of the operands. The type
> # of the result is that of the promoted left operand. If the value of
> # the right operand is negative or is greater than or equal to the width
> # of the promoted left operand, the behavior is undefined.

Thank you for the pointer!
I've been hacking some C for a while but haven't hit this thing nor
theoretically learned it until now.
Well, i think I'll have to add some checks/limits to x>>n constructs
that I have now. Pity that it's impossible for a compiler to warn when
right operand is a variable.

-- 
Andriy Gapon


More information about the freebsd-hackers mailing list