У меня есть прошивка C для устройства, которое отправляет набор из 6 флагов, закодированных в двоичном виде, в настольное приложение. В данный момент микропрограмма создает переменную unsigned int
, в которой она пытается добавить к ней шесть чисел в диапазоне от 0 до 30, закодированных в 5 битах. Код, подобный используемому, следующий:
KVAr_estagios_1_to_6 = 1;
KVAr_estagios_1_to_6 = KVAr_estagios_1_to_6 + (2 * (0x00000020));
KVAr_estagios_1_to_6 = KVAr_estagios_1_to_6 + (3 * (0x00000400));
KVAr_estagios_1_to_6 = KVAr_estagios_1_to_6 + (4 * (0x00008000));
KVAr_estagios_1_to_6 = KVAr_estagios_1_to_6 + (5 * (0x00100000));
KVAr_estagios_1_to_6 = KVAr_estagios_1_to_6 + (6 * (0x02000000));
Выполняя тесты, я обнаружил, что первое из шестизначных чисел всегда получается неправильным: оно всегда было нулевым независимо от значения, которое было ему установлено (в моем примере кода выше, 1
). Более того, это произошло только после шестой, последняя строка была добавлена в код; Если было сделано только 5 добавлений, проблем не возникает.
Таким образом, в приведенном выше примере кода я ожидаю увидеть десятичное число 206703681, которое будет отображаться эквивалентно двоичному 001100010100100000110001000001. Однако вместо этого оно показывает 20670368 0 или 110001010010000011000100000 0 . И если я решу не вставлять последнюю строку кода (KVAr_estagios_1_to_6 = KVAr_estagios_1_to_6 + (6 * (0x02000000));
), проблема исчезнет, и первый номер будет правильно установлен, но теперь отсутствует последний флаг, который я хочу отправить.
Я пробовал много разных способов сделать бинарное сложение без успеха. У меня сложилось впечатление, что какая-то дополнительная информация «переполняет» переменную, чего не должно происходить, так как я работаю с unsigned int, то есть доступно 32 бита.
Любая помощь приветствуется. Не стесняйтесь делать уточняющие вопросы; описать происходящее было нелегко.