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)