This is because i is promoted to an unsigned value before comparison. This will set it to the value of UINT_MAX, which on a 32 bit machine equals to 4294967295. So your loop is essentially the same as:
// will never run
for (i = 4294967295; i <= u; i++) {
count++;
}