If min+max is a negative signed int, then the result of right shifting is implementation dependent.
Instead, you could do
int middle = (unsigned)(min + max) >> 1;
If min+max is a negative signed int, then the result of right shifting is implementation dependent.
Instead, you could do
Still, this relies on the original indices falling in the non-negative range of signed ints.