Предположим, что у меня есть две переменные size_t
, и мне нужно их умножить и получить результат как size_t
.
size_t first = ...;
size_t second = ...;
size_t result = first * second;
Они могут переполняться, поэтому мне нужно проверить это.
"Чистым" способом было бы сначала проверить, что умножение возможно с помощью деления:
if( second != 0 && first > ((size_t)-1) / second ) {
//handle overflow
}
//proceed with computing first * second
По-видимому, менее "чистый" способ состоит в том, чтобы сначала размножить, а затем проверить результат с делением:
size_t result = first * second;
if( second != 0 && result / second != first )
//handle overflow
}
Однако, поскольку умножение беззнаковых чисел "безопасно переполняет", обертывая вокруг нуля, это работает просто отлично и выглядит эквивалентно предыдущему коду (который сначала проверяет, а затем умножает).
Есть ли потенциальные проблемы со вторым кодом? Всегда ли это будет так же хорошо, как и первое?