khlenar 5 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба Здравствуйте все. Не могу понять, почему такое выражение как if(~(ind | 0xFE))... не работает. А так temp = ~(ind | 0xFE); if(temp)... работает??? IDE Atollic. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба 4 minutes ago, khlenar said: if((~(ind | 0xFE)))... А так будет работать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба Не, не работает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба Тупизм какой то.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 83 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба 6 минут назад, khlenar сказал: Тупизм какой то.. А в asm заглянуть не получается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба Огласите, пожалуйста, типы переменных temp и ind. Подозреваю, что - char. Почитайте про приведение типов в языке С. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба uint8_t temp , ind; 4 минуты назад, Палыч сказал: Подозреваю, что - char. Почитайте про приведение типов в языке С. Много раз читал... Интересно, то, что это находится в задаче FreeRtos как то может влиять.? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба Растолковываю: ind - uint8_t (unsigned char ) 0xFE - int Перед вычислением (ind | 0xFE) приводится значение переменной ind к типу int; результат - типа int, где старшие 8 бит имеют нулевое значение. Результат вычисления ~(ind | 0xFE) тоже будет иметь тип int, но восемь старших бит будут иметь значение 1. Оператор под if(~(ind | 0xFE)) будет всегда выполнятся, т.к. значение выражения - не ноль. При temp = ~(ind | 0xFE); старшие 8 бит потеряются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба Судя по асму, в первом случае компилятор не создает условие if(), во втором создает. Но от этого как то не легче 4 минуты назад, Палыч сказал: Растолковываю: ind - uint8_t (unsigned char ) 0xFE - int Перед вычислением (ind | 0xFE) приводится значение переменной ind к типу int; результат - типа int, где старшие 8 бит имеют нулевое значение. Результат вычисления ~(ind | 0xFE) тоже будет иметь тип int, но восемь старших бит будут иметь значение 1. Оператор под if(~(ind | 0xFE)) будет всегда выполнятся, т.к. значение выражения - не ноль. При temp = ~(ind | 0xFE); старшие 8 бит потеряются. И что же делать ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба Только что, khlenar сказал: И что же делать ? Например: if((~ind) & 0x01) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба Только что, Палыч сказал: Например: if((~ind) & 0x01) в операторе if(uint8_t) ~(ind | 0xFE)) привел, заработало. Но у меня (uint8_t)(ind | 0xFE) в макросе. Почему же так не работает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба 1 минуту назад, khlenar сказал: Почему же так не работает? При вычислении ~((uint8_t)(ind|0xFE)) перед выполнением оператора ~ значение (uint8_t)(ind|0xFE) снова будет преобразовано к типу int. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба 1 минуту назад, Палыч сказал: При вычислении ~((uint8_t)(ind|0xFE)) перед выполнением оператора ~ значение (uint8_t)(ind|0xFE) снова будет преобразовано к типу int. Ясно. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба Действительно, приведите, пожалуйста, ассемблерный листинг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба 1 минуту назад, haker_fox сказал: Действительно, приведите, пожалуйста, ассемблерный листинг. Да, в общем то дело в типах. Компилятор оптимизирует. Если всегда истинно, просто выкидывает if() Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться