Mam tablicę w C, którą chcę adresować w sposób podobny do bufora kołowego, więc na przykład: a[-1]
zwróci mi ostatni element tablicy.Dziwne wyniki arytmetyki modulo z liczbami ujemnymi i unsigned mianownikami
Aby to zrobić Próbowałem użyć arytmetyki modulo (oczywiście), problemem jest to, Dostaję dość dziwne wyniki, gdy zaangażowane są liczby ujemne:
-1 % 4 = -1
-1 % 4U = 3
Tak daleko, tak dobrze.
-1 % 4000 = -1
(-1+4000U) % 4000U = 3999
(-1) % 4000U = 3295
Pytanie: Wartość (3295) nie trzymać za (a/b)*b + a%b shall equal a, truncated towards zero
(dla a=-1, b=4000
) od standardu C (6.5.5 # 6), więc nie jest to bug per se, ale dlaczego jest standard zdefiniowany w ten sposób ?! Na pewno musi być jakaś logika w tym ...
Jak mam napisać a%b
uzyskać sensownych wyników dla ujemny a
(jak (a+b)%b
przestaje działać, gdy abs(a)>b
)?
aplikacja testowa:
#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;
}