http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59961
--- Comment #1 from Andreas Schwab <sch...@linux-m68k.org> --- -100 is not the same as -s1. The latter is SIZE_MAX + 1 - 100, a big number, depending on the size of size_t. If s1 is declared as unsigned short or unsigned char, it will be promoted to int before any futher operation is applied.