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 _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "[EMAIL PROTECTED]"