Рассмотрим типичную функцию абсолютного значения (где для аргумента интегральный тип максимального размера длинный):
unsigned long abs(long input);
Наивная реализация этого может выглядеть примерно так:
unsigned long abs(long input)
{
if (input >= 0)
{
// input is positive
// We know this is safe, because the maximum positive signed
// integer is always less than the maximum positive unsigned one
return static_cast<unsigned long>(input);
}
else
{
return static_cast<unsigned long>(-input); // ut oh...
}
}
Этот код запускает поведение undefined, потому что отрицание input
может переполняться, а инициирование переполнения целых чисел - undefined. Например, на машинах с дополнением 2s абсолютное значение std::numeric_limits<long>::min()
будет на 1 больше, чем std::numeric_limits<long>::max()
.
Что может сделать автор библиотеки для решения этой проблемы?