MicroDiP 1 18 апреля, 2015 Опубликовано 18 апреля, 2015 · Жалоба Добрый день. Из основной программы main() вызывается функция. В этой функции побитно проверяется глобальная переменная типа unsigned char com_flags, т.е. фактически хотелось попробовать сделать глобальную переменную флагов (раньше использовал структуру однобитных полей, но вот решил попробовать, как будет себя вести компилятор в случае с целой переменной). Далее после проверки каждого разряда, в случае если бит установлен, выполняется ряд простейших операций и далее этот бит должен сбрасываться в ноль. Биты с первого по седьмой сбрасываются и устанавливаются замечательно. А вот нулевой бит… Строчки вида com_flags&=254; com_flags&=~1; com_flags&=~(1<<0); стабильно компилируются в вычетание двойки из переменной: dec2.b [0x0004],[0x0004] //в регистре W2 (0x0004) находится адрес этой самой переменной Игры с оптимизацией и/или объявлением переменной как volatile ничего не меняют. Если же насильно вычитаю единицу из переменной - естественно это всё решает: команда dec2.b превращется в dec.b. Но как-то это не изящно. Структура с однобитными полями тоже вопрос решает. Но почему при работе с целой переменной происходит такое ? Только опубликовал вопрос, и сразу пришло понимание Всё вопрос снят: переменную нужно объявить как unsigned int. Нужно себе на стол поставить какого-нить деревянного "божка" и ему изливать душу: формулировка вопроса вслух упорядочивает мысли :yeah: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться