Мой вопрос очень похож на вопрос здесь, за исключением того, что я работаю с C.
Я написал некоторый код для поворота беззнакового целого числа; то есть функция bitRotate()
(код ниже).
Функция работает очень хорошо, когда вместо printf
s и scanf
s я напрямую помещаю литералы, которые хочу использовать, например. bitRotate(0xabcdef00,8);
в основной функции.
Однако, когда я передаю x в качестве аргумента, как в следующем коде, abcdef00, который был получен от пользователя, x искажается до ab000000. Я проверял, дважды проверял и отлаживал свой код несколько раз, и я почти уверен, что ошибка именно в этой части, но я не понимаю, почему.
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define WIDTH sizeof(unsigned int)*CHAR_BIT
unsigned int bitRotate(unsigned int, char );
int main()
{
unsigned int x;
char n;
while(1)
{
printf("Enter x: ");
scanf("%x", &x);
printf("Enter n: ");
scanf("%d", &n);
printf("%x\n", bitRotate(x,n));
}
return 0;
}
unsigned int bitRotate(unsigned int value, char n)
{
char un = abs(n);
unsigned int fallen = ~(0u);
if(un == WIDTH)
return value;
else if (un < WIDTH)
{
if (n < 0)
{
fallen >>= (WIDTH - n);
fallen = value & fallen;
fallen <<= (WIDTH - n);
value >>= n;
}
else
{
fallen <<= (WIDTH - n);
fallen = value & fallen;
fallen >>= (WIDTH - n);
value <<= n;
}
value |= fallen;
return value;
}
else
return 0;
}
"%d"
является неправильным спецификатором формата для вводаchar
черезscanf
. Вам нужно использовать"%c"
, а для использования пробела новой строки из предыдущей записи, я думаю, вам нужно использовать" %c"
(с начальным пробелом). Этот вопрос может быть полезен. - person yano   schedule 24.10.2019int response = getchar(); if(response == 'q') break;
в конец цикла. - person ryyker   schedule 24.10.2019scanf
и не печатаете свои числа. Как бы вы заметили ошибку, прежде чем вызывать функцию вращения? - person Gerhardh   schedule 24.10.2019scanf
приводит к повреждению числа. Хранение 4 или 8 байтов в одной символьной переменной не подходит. - person Gerhardh   schedule 24.10.2019CHAR_BIT
, я удалил комментарий, и да, его правильно использовать для того, что вы делаете. Извините за путаницу. - person ryyker   schedule 24.10.2019char un = abs(n);
может быть проблемой. это должно быть:int un = abs(n);
- person ryyker   schedule 24.10.2019un = abs(n)
может быть проблемой, за исключением случаев, когдаn
равно › 255, но для больших значенийn
вращение в любом случае не имеет особого смысла. - person Jabberwocky   schedule 24.10.2019if (n < 0)
основан на том, чтоchar
является подписанным типом, который может применяться или не применяться. Вместо этого вы должны использоватьsigned char
. - person Gerhardh   schedule 24.10.2019