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

156
02 марта 2018, 17:32

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

#include <stdio.h>

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.

Answer 1

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

Замените его на %hhd - для unsigned char.

Answer 2

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

Answer 3

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

READ ALSO
invalid operands of types что делать?

invalid operands of types что делать?

Добрый деньПроблема в чем? - выдает ошибку: "invalid operands of types 'double' and 'double(const char*) throw()' to binary 'operator=='" Вот фрагмент кода, в котором выдает ошибку:

155
Не открыть файл boost_thread-vc141-mt-gd-x32-1_66.lib

Не открыть файл boost_thread-vc141-mt-gd-x32-1_66.lib

Подключил буст, всё ок, но потом компилятор начал выдвать ошибку:

145
Общий элемент двух массивов

Общий элемент двух массивов

Имеется два массива (вектора, разницы нет какой контейнер использовать) нужно найти два элемента, которые есть и в первом и во второмКроме...

118
Создать exe-файл в Linux с использованием cmake

Создать exe-файл в Linux с использованием cmake

Необходимо под Linux системой (Ubuntu 17) собрать проект с использованием cmake

154