Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 13 Feb 2008 02:14:40 +0100
From:      deeptech71@gmail.com
To:        freebsd-chat@freebsd.org
Subject:   bits wrap when leftshifting non-constant amounts
Message-ID:  <47B24480.9020001@gmail.com>

next in thread | raw e-mail | index | archive | help
My gcc 3.4.6 behaves weirdly when left shifting, and I couldn't find any 
info on this.

the program:
#include <stdio.h>
int main( void ) {
	unsigned n;
	for( n = 13; n < 100; n += 7 ) {
		printf( "0x42f1u << %u = %u\n", n, 0x42f1u << n );
	}
	return 0;
}


the output:
0x42f1u << 13 = 140386304
0x42f1u << 20 = 789577728
0x42f1u << 27 = 2281701376
0x42f1u << 34 = 68548
0x42f1u << 41 = 8774144
0x42f1u << 48 = 1123090432
0x42f1u << 55 = 2021654528
0x42f1u << 62 = 1073741824
0x42f1u << 69 = 548384
0x42f1u << 76 = 70193152
0x42f1u << 83 = 394788864
0x42f1u << 90 = 3288334336
0x42f1u << 97 = 34274

When I left shift a constant amount, it works. That is:
     ( 1u << 34u ) == 0

But using a variable:
     unsigned lsh = 34;
     ( 1u << lsh ) == 4 !!!

It seems that lsh is first moduloed with the width of int. What the hell?



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?47B24480.9020001>