https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69984
--- Comment #6 from Edmar Wienskoski <edmar at freescale dot com> --- Hummm, You are almost convincing me, one last question, be patient with me. As Andrew posted: C = A * B should be equivalent to: C = (unsigned long)( ((int)A) * ((int)B) ) The variables are promoted *before* the multiplication. How come (int)65535 multiplied by itself is undefined behavior ? Or (unsigned short) 0x7FFF multiplied by itself, would not be undefined behavior as well ? In fact, re-writing the code as above, will generate unsigned comparison. So, why "C = A * B" is not doing the same ?