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

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

4 hours ago, khlenar said:

 if(~(ind | 0xFE))

Вот у одного меня возникает вопрос "что хотел сказать автор" ?

Как мне кажется, if (! (ind & 0x01)) куда более читаемо (и компилируется сразу без ошибок).

О том, что, например, ind & 0x04 понятнее, чем ind | 0xFB, вообще молчу...

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


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

3 часа назад, Палыч сказал:

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

Неправда. Будет приведено к unsigned int. Хотя это и несущественно.

И char - это необязательно знаковый 8-битный. Он может быть и беззнаковым. В зависимости от опций компилятора.

3 часа назад, khlenar сказал:

в операторе if(uint8_t) ~(ind | 0xFE))  привел, заработало.

Сами то поняли что сделали?  :biggrin:  Подсказываю: сделали аналог if (~(ind | 0xFE) & 255).

В подобных выражениях лучше приводить входящие переменные. Меньше кода на выходе будет...

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


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

2 часа назад, jcxz сказал:

Неправда. Будет приведено к unsigned int.

Цитата из стандарта ISO/IEC 9899:2011 (E) пункт 6.3.1.1 абзац 2

Цитата

If an int can represent all values of the original type (as restricted by the width, for a bit-field), the value is converted to an int; otherwise, it is converted to an unsigned int.

Все-таки будет приведено к int.

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


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

2 часа назад, Палыч сказал:

Цитата из стандарта ISO/IEC 9899:2011 (E) пункт 6.3.1.1 абзац 2

Все-таки будет приведено к int.

Чет сам затупился, если переменные ind типа uint8_t, выражение в скобках приводится к виду (uint8_t) , 0xFE - тоже укладывается в разрядную сетку типа uint8_t, какого рожна там должно быть  int ??

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


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

2 часа назад, Палыч сказал:

Цитата из стандарта ISO/IEC 9899:2011 (E) пункт 6.3.1.1 абзац 2

Все-таки будет приведено к int.

Почему тогда IAR компилит так?:

; LogChar0((u8)(ind | 0xF0) >> 1);
0x....             LDR.N    R0,??DataTable11_27
0x7800             LDRB     R0,[R0, #+0]
0xF050 0x00F0      ORRS     R0,R0,#0xF0
0xB2C0             UXTB     R0,R0            ;; ZeroExt  R0,R0,#+24,#+24
0x0840             LSRS     R0,R0,#+1

Ведь если после (u8)(ind | 0xF0) должно получаться int, то компилятор должен использовать ASRS, а не LSRS.

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


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

47 минут назад, mantech сказал:

Чет сам затупился, ... какого рожна там должно быть  int ??

По порядку:

1. Тип переменой ind - uint8_t или, что то же самое - unsigned char; тип константы 0xFE - int (см. п.6.4.4.1 абзац 5 стандарта).

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

3. Далее (uint8_t)(ind|0xFE) - тип явно приводится к uint8_t (unsigned char).

4. И наконец ~((uint8_t)(ind|0xFE)). Перед операцией ~ над операндом с типом unsigned char производится неявное преобразование - "integer promotions". Правило преобразования я цитировал выше.
 

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


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

А , что лучше,    (uint8_t)temp  или   temp & 0xFF  ?

Или компилятор преобразует  (uint8_t)temp  в  temp & 0xFF  ?

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


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

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

А , что лучше,    (uint8_t)temp  или   temp & 0xFF  ?

Без разницы. Откройте уже наконец-то окно дизассемблера! Вам уже много сообщений назад это советовали.

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


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

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

Без разницы. Откройте уже наконец-то окно дизассемблера! Вам уже много сообщений назад это советовали.

Я как то не вникал в ARMовский ассемблер.

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


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

1 час назад, Палыч сказал:

тип константы 0xFE - int (см. п.6.4.4.1 абзац 5 стандарта).

Остальное понятно, но вот это странно для меня, уж коли компилятор оптимизирующий, то почему б не оптимизировать числа в соотв. с разрядной сеткой...

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


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

36 минут назад, mantech сказал:

уж коли компилятор оптимизирующий, то почему б не оптимизировать числа в соотв. с разрядной сеткой...

Он и оптимизирует, если результат не будет отличаться от того, который получился бы с применением всех этих правил. Поэтому когда вы напишете  (uint8_t)~(ind|0xFE) - старший байт результата усекается, на результат выражения не влияет и вычисляться скорее всего не будет. а когда пишете ~((uint8_t)(ind|0xFE)) - влияет и вычисляется.

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


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

2 hours ago, jcxz said:

Почему тогда IAR компилит так?:

Потому что он знает, что этот int никогда не может быть отрицательным, и нет никакой разницы, применять ASRS или LSRS. 

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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