"Specifically, it fails if the sum of low and high is greater than the maximum positive int value (231 - 1). The sum overflows to a negative value, and the value stays negative when divided by two." -https://ai.googleblog.com/2006/06/extra-extra-read-all-about...
As soon as your array is storing objects that are 2 bytes or larger, you can't overflow the unsigned integer any more. The same applies for a 64 bit address and 64 bit integers. Never mind that most 64 bit hardware in existence is actually limited to a 48 bit address space, in which case the bug CAN NOT be exercised even with signed integers.
It's less concerning for C#, which is a managed language, of course.
mid = min + (max - min) / 2;
add rax, rbx
rcr rax, 1
It explicitly uses the carry flag from the addition as the top bit of the right-rotated result.
Not super useful for anything other than averaging two uints but that's x86 for you.
What I missed in my first pass was
* Forgetting exactly which register was the low index and which was the high index
* Underflow if array size was zero from setting the last index to (size - 1)edit: this is a bit longer version, if signed conversion/shift is not available: int mid = (min >> 1) + (max >> 1) + (min & max & 1)
Where x is min and y is max, the midpoint is:
(x+y)/2 = x+(y-x)/2 x+y = 2x+y-x x+y=x+y