Tengo una matriz en C que quiero abordar de manera similar a un búfer circular, por ejemplo: a[-1]
me devolvería el último elemento de la matriz.Resultados extraños de la aritmética de módulo con números negativos y denominadores sin signo
para hacer eso traté de usar la aritmética de módulo (obviamente), el problema es, que estoy obteniendo resultados bastante extraños cuando los números negativos están involucrados:
-1 % 4 = -1
-1 % 4U = 3
Hasta ahora, todo bien.
-1 % 4000 = -1
(-1+4000U) % 4000U = 3999
(-1) % 4000U = 3295
Pregunta: El valor (3295) no mantener durante el estándar C (a/b)*b + a%b shall equal a, truncated towards zero
(por a=-1, b=4000
) a partir de (6.5.5 # 6) así que no es un error per se, pero qué es el estándar definido de esta manera ?! Seguramente, debe haber cierta lógica en este ...
¿Cómo tengo que escribir a%b
para obtener resultados razonables para a
negativo (como (a+b)%b
deja de funcionar cuando abs(a)>b
)?
aplicación de la prueba:
#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;
}