Перейти к содержанию
    

Непонятки с оператором if()...

Здравствуйте все. 

Не могу понять, почему такое выражение как if(~(ind | 0xFE))... не работает. А так temp = ~(ind | 0xFE);   if(temp)...  работает???  IDE Atollic. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, khlenar said:

if((~(ind | 0xFE)))...

А так будет работать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, khlenar сказал:

Тупизм какой то.. :dash2:

А в asm заглянуть не получается?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Огласите, пожалуйста, типы переменных temp и ind.

Подозреваю, что - char. Почитайте про приведение типов в языке С.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

uint8_t  temp , ind;

4 минуты назад, Палыч сказал:

 

Подозреваю, что - char. Почитайте про приведение типов в языке С.

Много раз читал...

Интересно, то, что это находится в задаче FreeRtos как то может влиять.?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Растолковываю:

ind - uint8_t (unsigned char )

0xFE - int

Перед вычислением (ind | 0xFE) приводится значение переменной ind к типу int; результат - типа int, где старшие 8 бит имеют нулевое значение.

Результат вычисления ~(ind | 0xFE) тоже будет иметь тип int, но восемь старших бит будут иметь значение 1.

Оператор под if(~(ind | 0xFE)) будет всегда выполнятся, т.к. значение выражения - не ноль. При  temp = ~(ind | 0xFE); старшие 8 бит потеряются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Судя по асму, в первом случае компилятор не создает условие 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 бит потеряются.

И что же делать ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, khlenar сказал:

И что же делать ?

Например: if((~ind) & 0x01)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, Палыч сказал:

Например: if((~ind) & 0x01)

в операторе if(uint8_t) ~(ind | 0xFE))  привел, заработало. Но у меня (uint8_t)(ind | 0xFE) в макросе. Почему же так не работает? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, khlenar сказал:

Почему же так не работает? 

 При вычислении  ~((uint8_t)(ind|0xFE)) перед выполнением оператора ~ значение (uint8_t)(ind|0xFE) снова будет преобразовано к типу int.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Палыч сказал:

 При вычислении  ~((uint8_t)(ind|0xFE)) перед выполнением оператора ~ значение (uint8_t)(ind|0xFE) снова будет преобразовано к типу int.

Ясно. Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Действительно, приведите, пожалуйста, ассемблерный листинг.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, haker_fox сказал:

Действительно, приведите, пожалуйста, ассемблерный листинг.

Да, в общем то дело в типах. Компилятор оптимизирует. Если всегда истинно, просто выкидывает if()

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...