http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48197
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> 2011-03-18 19:56:42 UTC --- x = (long)0 > ((unsigned int)0 ^ (signed short)0x8000); x = (long)0 > ((unsigned)0 ^ (unsigned)0x8000); I think you missed something here (unsigned)(signed short) still sign extends.