modulo with negative int

hello
I'm having some difficulties in cycling between a range of value..

int c = 0;
int length = 4;
c = -1 % length;
lcd.print(c);

If I use this code I get -1 as result..if I use "unsigned" for c, I get 65535.
I'd like to get 3: (Google)

If I'm not wrong I used to use % to get always a number in the range of the divisor, both when using negative or positive dividend..
what I'm missing?

Intro paragraph gives you the answer.

Moderator edit: Tags removed

Sorry it took four years for a reply. I came across this while looking for the same thing. Saw the reply and figured it was worthy of something more useful.

Thought about the problem for a few secs and realised its pretty easy to solve. Just add the length to your value before calculating:

int c = 0;
int length = 4;
c = (-1 + length) % length;
lcd.print(c);

In most cases this will suffice as most algorithms just want to loop around arrays and get to the other end of the array when doing some sort of simple traversal. For me, it was a ring of LEDs I was animating using the FastLED library.

Hope that helps. If your calculations exceed the length you'll need to add a multiple of length to push the number to be positive before using the modulo operator.

1 Like

This one is better, it is not restricted by having to add a fixed offset:

void setup() {
  Serial.begin(9600);

  int c;
  const int length = 4;

  for (int i = -10; i <= 10; i++)
  {
    c = (unsigned int)i % length;
    Serial.print(i);
    Serial.print(" is mod ");
    Serial.println(c);
  }
}
void loop() {}

rats

Instead of using %, you can write your own function like this:

int mod( int x, int y ){
return x<0 ? ((x+1)%y)+y-1 : x%y;
}

Then, mod(-1, 4) does return 3 as you'd expect.

cwalger:
Instead of using %, you can write your own function like this:

int mod( int x, int y ){
return x<0 ? ((x+1)%y)+y-1 : x%y;
}

Then, mod(-1, 4) does return 3 as you'd expect.

Perfect, thanks for posting this.