Dlaczego to jest niezdefiniowane zachowanie?

Moja odpowiedź nato pytanie to była ta funkcja:

inline bool divisible15(unsigned int x) 
{
    //286331153 = (2^32 - 1) / 15
    //4008636143 = (2^32) - 286331153
    return x * 4008636143 <= 286331153;
}

Jednak doskonale działał na moim komputerze z kompilatorem VS2008tutaj to w ogóle nie działa.

Czy ktoś ma pomysł, dlaczego otrzymuję różne wyniki na różnych kompilatorach?unsigned przepełnienie nie jest niezdefiniowanym zachowaniem.

Ważna uwaga: po pewnym teście potwierdzono, że jest szybszy niż wzięcie pozostałej części dywizji o 15. (Jednak nie na wszystkich kompilatorach)

questionAnswers(2)

yourAnswerToTheQuestion