Рассмотрим типичную абсолютную функцию значения (где для аргумента интеграла типа максимального размера в длину):Есть ли безопасный способ получить абсолютное значение без знака целого числа со знаком, без запуска переполнения?
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...
}
}
Этом код вызывает неопределенное поведение, потому что отрицание input
может переполняться, а инициирование целочисленного переполнения со знаком является неопределенным поведением. Например, на машинах с дополнением 2s абсолютное значение std::numeric_limits<long>::min()
будет 1 больше, чем std::numeric_limits<long>::max()
.
Что может сделать автор библиотеки для решения этой проблемы?
Хороший ответ, хотя на свой вопрос, но +1. – Bathsheba