Страницы

Поиск по вопросам

среда, 25 декабря 2019 г.

Побитовые операции и сдвиги (C/C++)

#cpp #c


Имеется следующий код: 

#include 


int main()
{
   int UnitStateWord;
   unsigned char c,f;
   printf("Insert state code (0 - 31) >");
   scanf("%d",&c);
   UnitStateWord = (c & 0x1F) << 11;
   printf("\n? The result = %04x\n", UnitStateWord);
   printf("Insert if error exists (0/1) >");
   scanf("%d",&f);
   UnitStateWord |= (f & 1) << 9;
   printf("\n? The result = %04x\n", UnitStateWord);
}




На вход поступило: 1, затем ещё 1, вывод видно в The result.
Почему после второго ввода и выполнении соответствующей операции


  UnitStateWord |= (c & 1) << 9;


Переменная UnitStateWorld = 200? В моем понимании она должна быть равна A00.
    


Ответы

Ответ 1



Скорее всего, затирание соседней памяти из-за неверного спецификатора %d. Замените его на %hhd - для unsigned char.

Ответ 2



У вас четыре ошибки при интерпретации стандартного ввода. Во-первых спецификатор формата для unsigned char должен быть %hhu (доступен начиная с С++11, до этого заполнить переменные такого типа было нельзя). Во вторых отсутствует проверка значения, возвращаемого scanf, поэтому в обе переменные c и f так и могут остаться неинициализированными.

Ответ 3



Мучаясь в течение дня с теми или иными способами, дабы исправить эту проблему, сменил IDE и соответственно компилятор на VC. Всё работает без ошибок, в чём проблема - неизвестно.

Комментариев нет:

Отправить комментарий