http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55967
Bug #: 55967 Summary: rightshift an unsigned value (X) by it's number of bits does not always yield 0, when X is an unsigned that's leftshifted by it's number of bits and offset Classification: Unclassified Product: gcc Version: 4.6.2 Status: UNCONFIRMED Severity: major Priority: P3 Component: c AssignedTo: unassig...@gcc.gnu.org ReportedBy: b1262...@rmqkr.net Hi, I'm curring gcc via MinGW on a 32 bit PC: The output of the following /********************************************/ #include <stdio.h> int main(void) { printf("%lu\n", ((1U<<(32)))); printf("%lu\n", ((1U<<(32))) + 0x80000000U); printf("%lu\n", (((1U<<(32))) + 0x80000000U) >> 32U); /* expecting 0 but get 0x80000000U instead. BUG???? */ printf("%lu\n", ( 0x80000000U) >> 32U); /* compare: here correctly get 0! */ printf("%lu\n", (((1U<<(32))) ) >> 32U); /* compare: here correctly get 0! */ return 0; return 0; } /********************************************/ is: 0 2147483648 2147483648 // Bug! 0 0 THE 3rd output line IS A BUG, right? I expect to get 0. And why do I expect 0. Because I've got a 32-bit number and rightshift it by 32. Ouput lines 4 and 5 do that correctly: they yield 0. So what's going on in line 3 ? gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.6.2/lto-wrapper.exe Target: mingw32 Configured with: ../gcc-4.6.2/configure --enable-languages=c,c++,ada,fortran,objc,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs --build=mingw32 --prefix=/mingw Thread model: win32 gcc version 4.6.2 (GCC) Thanks.