Ответ получен в другом посте Арифметическое смещение битов на целом числе со знаком .Чтобы получить ожидаемый результат, вы должны использовать unsigned char.
void right(unsigned char *c, int numRotate) {
*c = (*c >> numRotate) | (*c << (8 - numRotate));
}
Оператор сдвига вправо со целым числом со знаком заполнит оставшееся место знаковым битом (MSB) так:
10011010 >> 4 == 11111001
01011010 >> 4 == 00000101
Ответ на вопрос, который я связал, утверждает, что это зависит от компилятора / платформы.Таким образом, общая методика оптимизации, заключающаяся в замене умножения / деления на степени 2 операциями битового сдвига, работает с отрицательными числами.Пример:
#include <stdio.h>
int main()
{
char x = -4;
printf("0x%x -> %i\n", x, x);
x <<= 1; //multiply by 2^1 = 2
printf("0x%x -> %i\n", x, x);
x >>= 2; //divide by 2^2 =4
printf("0x%x -> %i\n", x, x);
return 0;
}
Вывод:
0xfffffffc -> -4
0xfffffff8 -> -8
0xfffffffe -> -2