Для любого целого числа W, ограниченного диапазоном R = [x, y], "переполнение" из-за отсутствия лучшего термина W над R равно W % (y-x+1) + x
. Это заставляет его обертываться назад, если W превышает y.
В качестве примера этого принципа предположим, что мы перебираем за календарные месяцы:
int this_month = 5;
int next_month = (this_month + 1) % 12;
где оба целых числа будут от 0 до 11 включительно. Таким образом, выражение выше "фиксирует" целое число в диапазоне R = [0,11]. Этот подход использования выражения простой, изящный и выгодный, поскольку он опускает ветвление.
Теперь, что, если мы хотим сделать то же самое, но назад? Следующее выражение работает:
int last_month = ((this_month - 1) % 12 + 12) % 12;
но это заумно. Как это можно украсить?
tl; dr - Можно ли еще упростить выражение ((x-1) % k + k) % k
?
Примечание. Тег С++ указан, потому что другие языки обрабатывают отрицательные операнды для оператора modulo по-разному.