strange bit-shifting
Eric Anderson
anderson at freebsd.org
Tue Apr 3 17:41:06 UTC 2007
On 04/03/07 12:22, Andriy Gapon wrote:
> $ cat test_shl.c
> #include <stdint.h>
> #include <stdio.h>
>
> int main()
> {
> uint64_t l;
>
> l = 0;
> l--;
> printf("%.16lX\n", l);
> l <<= 64;
> printf("%.16lX\n", l);
> return 0;
> }
>
> $ cc test_shl.c -o test_shl
> test_shl.c: In function `main':
> test_shl.c:11: warning: left shift count >= width of type
> $ ./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.
>
I see the same thing on -CURRENT. I was doing something like:
uint64_t l;
l = 1 << 40;
but instead did:
l = (1 << 30) * 1024;
which works fine.
This was on i386.
Eric
More information about the freebsd-hackers
mailing list