We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
I write the code as following to evaluate the expression n = n / 2
asrs r0, r0, #1
But, I found the GCC will translate the expression n = n / 2 into the following instruction
lsrs r1, r0, #31
adds r0, r1, r0
Why does it need to add the sign bit?
Hello Chi-wai,
it is because to compensate shift error in the negative integer case.
For example, we think of -3 (i.e. 0xFFFFFFFD).
If is it right shifted by 1, the result is 0xFFFFFFFE (-2). Although we expect it as 0xFFFFFFFF (-1).
Therefore by adding the sign bit to 0xFFFFFFFD, making 0xFFFFFFFE.
By right shifting 0xFFFFFFFE by 1, resulting to 0xFFFFFFFF. It will match with our expectation.
Best regards,
Yasuhiko Koumoto.