У меня есть массив в C, который я хочу адресовать так же, как круглый буфер, поэтому, например: a[-1]
вернет мне последний элемент массива.
Для этого я попытался использовать modulo арифметику (очевидно), проблема в том, что я получаю довольно странные результаты, когда задействованы отрицательные числа:
-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), поэтому оно не является ошибкой как таковой, но почему это стандарт, определенный таким образом?! Конечно, в этом должна быть какая-то логика...
Как мне написать 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;
}