Все предыдущие публикации комментировали стандарт C99, но на самом деле эта гарантия уже была доступна ранее.
Пятый абзац раздела 6.1.2.5 Типы
стандартных состояний C89
Вычисление с использованием беззнаковых операндов никогда не может быть переполнено,
потому что результат, который не может быть представлен в результате без знака
целочисленный тип уменьшается по модулю на число, которое на единицу больше
наибольшее значение, которое может быть представлено результирующим целочисленным типом без знака.
Обратите внимание, что это позволяет программистам на С заменять все беззнаковые деления на некоторую константу, которая должна быть заменена умножением на обратный элемент кольца, образованный C арифметикой по модулю 2 ^ N.
И это можно сделать без какого-либо «исправления», поскольку это было бы необходимо путем аппроксимации деления умножением с фиксированной запятой на обратное значение.
Вместо этого можно использовать расширенный алгоритм Евклида, чтобы найти обратный элемент и использовать его в качестве множителя. (Разумеется, для обеспечения переносимости следует также применять побитовые операции И, чтобы обеспечить одинаковую ширину в результатах.)
Возможно, стоит прокомментировать, что большинство компиляторов C уже реализуют это как оптимизацию. Однако такая оптимизация не гарантируется, и поэтому программистам все еще может быть интересно выполнять такие оптимизации вручную в ситуациях, когда важна скорость, но возможности оптимизатора C либо неизвестны, либо особенно слабы.
И, наконец, причина, по которой вообще нужно пытаться сделать это: инструкции на уровне машины для умножения обычно намного быстрее, чем для деления, особенно на высокопроизводительных ЦП.