2014-01-22 5 views
6

Я пытаюсь повернуть символ unsigned с помощью 'n' бит. Но я не получаю желаемого результата. Это мой кодвращение неподписанного символа на n бит

void left_rotate(unsigned char a, int no){ 
     // no - number of times to rotate 
     printf("%d\n", ((a << no) | (a >> (8-no)))); 
} 

Я называю эту функцию из почты следующим

unsigned char a = 'A'; 
left_rotate(a, 2); 

Я ожидал следующие выходные данные

//'A' = 65 = 01000001 
// I am rotating in left direction by two times 
// a << 2 = 00000100 
// a >> 6 = 00000001 
(00000100 | 00000001 = 00000101 = 5 in decimal) 

Но у меня другой выход

// The output in my screen = 100000101 = 261 in decimal 

что 1 в MSB ползут? Я использую unsigned char как тип данных. Поэтому он не должен превышать 8 бит. Может ли кто-нибудь объяснить это?

Благодаря

чида

+0

Вы переходите в (или через) бит знака подписанного типа ('char'). Это неопределенное поведение **. Вместо этого используйте 'unsigned char'. – WhozCraig

+0

@WhozCraig Где он переводит подписанный 'char'? –

+0

@ H2CO3 в моей лишенной кофе головорезые головы. Спасибо, что поддержал меня честно, сэр = P – WhozCraig

ответ

10

Поскольку << продвигает свои аргументы unsigned int, вам нужно замаскировать старшие биты результата сдвига:

printf("%d\n", (((a << no) & 0xFF) | (a >> (8-no)))); 

Demo on ideone (отпечатки 5).

+2

Хотел бы я обновить * все * ваши ответы только для вашего аватара pic; rrod. Это * выдающийся *. Увы, это легко заслуживает голосования. – WhozCraig

+0

Спасибо, ребята, за ответы – CHID

Смежные вопросы