For signed values, if the high-order bit is a 1, the number is negative.
(This is true for 1's complement, 2's complement, and sign-magnitude
representations.) If you were using a right shift to implement division,
you'd want a negative number to stay negative, so on some computers, under
some compilers, when you shift a signed value right and the high-order bit
is 1, new 1 bits are shifted in at the left instead of 0s. However, you
can't depend on this, because not all computers and compilers implement
right shift this way. In any case, shifting negative numbers to the right
(even if the high-order 1 bit propagates) gives you an incorrect answer if
there's a remainder involved: in 2's complement, 16-bit arithmetic, -15 is
0xfff1, so -15 >> 1 might give you 0xfff8shifted which is -8. But integer
division is supposed to discard the remainder, so -15 / 2 would have given
you -7. (If you're having trouble seeing the way the shift worked, 0xfff1 is
1111111111110001<sub>2</sub> and 0xfff8 is 1111111111111000<sub>2</sub>. The
low-order 1 bit got shifted off to the right, but because the high-order bit
was 1, a 1 got shifted in at the left.)

-- 
You received this message because you are subscribed to the Google Groups 
"Algorithm Geeks" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/algogeeks?hl=en.

Reply via email to