http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53986
--- Comment #6 from vries at gcc dot gnu.org 2012-08-05 13:32:15 UTC --- > s_1 (u)s_1 s_1+16 ((u)s_1)+16 T T > -16 4294967280 0 0 0 0 > -12 4294967284 4 4 0 0 > -9 4294967287 7 7 0 0 > -17 4294967279 -1 4294967295 0 1 > $ I think you forgot the cast to unsigned after the add that represents the currently generated code: ... @@ -13,7 +13,7 @@ unsigned int uv = (unsigned) v; printf ("%-12d%-12u%-12d%-12u\t%2d%2d\n", v, uv, v+16, uv+16, - (v+16) > 7, (uv+16) > 7); + (unsigned int)(v+16) > 7, (uv+16) > 7); } return 0; } ... With that added I see: ... s_1 (u)s_1 s_1+16 ((u)s_1)+16 T T -16 4294967280 0 0 0 0 -12 4294967284 4 4 0 0 -9 4294967287 7 7 0 0 -17 4294967279 -1 4294967295 1 1 ... We now see the correct result for all 4 cases for both methods.