Ваш код имеет неопределенное поведение.
В этом вызове
scanf("%d", &n);
вы используете неправильный спецификатор преобразования с объектом типа char
. Более того, тип char
может вести себя как signed char
или как unsigned char
в зависимости от опции компилятора.
В функции используется неправильное выражение, когда n отрицательно
fallen >>= (WIDTH - n);
^^^
fallen <<= (WIDTH - n);
^^^
Я думаю, вы имеете в виду
fallen >>= (WIDTH + n);
^^^
fallen <<= (WIDTH + n);
^^^
В любом случае функция может быть написана проще. Вот демонстрационная программа.
#include <stdio.h>
#include <limits.h>
unsigned int bitRotate(unsigned int value, int n )
{
const int Width = sizeof( unsigned int ) * CHAR_BIT;
n %= Width;
if ( n < 0 )
{
value = ( value >> -n ) | ( value << ( Width + n ) );
}
else if ( n > 0 )
{
value = ( value << n ) | ( value >> ( Width - n ) );
}
return value;
}
int main(void)
{
while ( 1 )
{
unsigned int x;
printf( "Enter a hexadecimal value of x (0 - exit): " );
if ( scanf( "%x", &x ) != 1 || x == 0 ) break;
int n;
printf( "Enter a negative or positive value of n (0 - exit): " );
if ( scanf( "%d", &n ) != 1 || n == 0 ) break;
printf( "\n%#x shifted %d is %#x\n", x, n, bitRotate( x, n ) );
}
return 0;
}
Вывод может выглядеть как
Enter a hexadecimal value of x (0 - exit): 0xabcdef00
Enter a negative or positive value of n (0 - exit): 16
0xabcdef00 shifted 16 is 0xef00abcd
Enter a hexadecimal value of x (0 - exit): 0xabcdef00
Enter a negative or positive value of n (0 - exit): -16
0xabcdef00 shifted -16 is 0xef00abcd
Enter a hexadecimal value of x (0 - exit): 0xabcdef00
Enter a negative or positive value of n (0 - exit): 32
0xabcdef00 shifted 16 is 0xabcdef00
Enter a hexadecimal value of x (0 - exit): 0