У меня есть массив в C, к которому я хочу обратиться аналогично циклическому буферу, например: a[-1]
вернул бы мне последний элемент массива.
Для этого я попыталсяесли использовать арифметику по модулю (очевидно), проблема в том, что я получаю довольно странные результаты, когда задействованы отрицательные числа:
-1 % 4 = -1
-1 % 4U = 3
Пока все хорошо.
-1 % 4000 = -1
(-1+4000U) % 4000U = 3999
(-1) % 4000U = 3295
Вопрос: Значение (3295) действительно для (a/b)*b + a%b shall equal a, truncated towards zero
(для a=-1, b=4000
) из стандарта C (6.5.5 # 6), так что это не ошибка per se , но почему стандарт определен таким образом ?!Конечно, в этом должна быть какая-то логика ...
Как мне написать a%b
, чтобы получить ощутимые результаты для отрицательных значений a
(так как (a+b)%b
перестает работать, когда abs(a)>b
)?
Тестовое приложение:
#include <stdio.h>
int main(int argc, char **argv) {
int i=0;
#define MAX_NUM 4000U
int weird = (i-1)%MAX_NUM;
printf("%i\n", weird);
printf("%i\n", (i-1+MAX_NUM))%MAX_NUM);
printf("a: %i, b: %i, a from equation: %i\n", i-1, MAX_NUM,
((i-1)/MAX_NUM)*MAX_NUM + weird);
return 0;
}