I am writing a cycle method for a list that moves an index either forwards or backwards. The following code is used to cycle backwards:
(i-1)%list_length
In this case, i
is of the type usize
, meaning it is unsigned. If i
is equal to 0, this leads to an 'attempt to subtract with overflow' error. I tried to use the correct casting methods to work around this problem:
((i as isize)-1)%(list_length as isize)) as usize
This results in an integer overflow.
I understand why the errors happen, and at the moment I've solved the problem by checking if the index is equal to 0, but I was wondering if there was some way to solve it by casting the variables to the correct types.
As DK. points out, you don't want wrapping semantics at the integer level:
Instead, you want to use modulo logic to wrap around:
This only works if
len
+idx
is less than the max of the type — this is much easier to see with au8
instead ofusize
; just setidx
to 200 andlen
to 250.If you can't guarantee that the sum of the two values will always be less than the maximum value, I'd probably use the "checked" family of operations. This does the same level of conditional checking you mentioned you already have, but is neatly tied into a single line: