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

Хмммм.... А что такое "продвинутое uint16_t"? Я отстал от жизни и в си ввели новые "продвинутые" типы?

И как именно из беззнакового 0xFFFE получается 0xFFFFFFFE?

Продвинутый - это буквальный перевод термина "promotions", наверное неудачный.

Правила "integral promotions" предписывают расширение до типа способного полностью представить исходное значение

в порядке int, unsigned int, long int, unsigned long int, и т.д.

Первый тип для 32-го компилятора - знаковый int может полностью представить весь диапазон значений uint16_t, поэтому

и происходит расширение uint16_t - > signed int (32).

 

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


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

Правильно, продвигается до знакового целого. Но почему 65534 должно "превратиться в -1?

jcxz, об чем вы, о каких ошибках? Я где хочу,там пишу с ошибками, а компилятор их ловит. Где хочу читаю все ремарки.

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


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

Правильно, продвигается до знакового целого. Но почему 65534 должно "превратиться в -1?

jcxz, об чем вы, о каких ошибках? Я где хочу,там пишу с ошибками, а компилятор их ловит. Где хочу читаю все ремарки.

Ах, точно, Вы правы - у меня опечятка: в результате расширения получается знаковый 0x0000FFFE.

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


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

О! Может, топикстартер все же напутал с определением своего типа беззнакового?

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


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

Каким боком тут ifdef???

таким, что если бы я хотел написать нечто осмысленное, то использовал ifdef

а так как написан if, то вероятно тут косяк, о коем компилятор обязан сообщить

 

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


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

О! Может, топикстартер все же напутал с определением своего типа беззнакового?

Когда я разместил примеры в файлах - там уже стандартные названия сишных типов, как раз чтобы не было путаницы.

 

 

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


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

О! Может, топикстартер все же напутал с определением своего типа беззнакового?

Знаковость тут присутствует лишь в силу упоминания правил "integral promotions".

В случае, если бы temp1 и temp2 были знаковыми, результат был совершенно тем же.

 

Грубо говоря, написанный код if (~temp1 != temp2) компилятор видит как if(~rvalue32(temp1)!=rvalue32(temp2))

 

~rvalue32(temp1) совершенно другое значение нежели ~temp1.

Изменено пользователем aiwa

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


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

Почему никто не комментирует листинги от Кейла? Все пытаются оправдать ИАР.

 

Когда я разместил примеры в файлах - там уже стандартные названия сишных типов, как раз чтобы не было путаницы.

И Кейл их скомпилировал, как надо.

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


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

Почему никто не комментирует листинги от Кейла? Все пытаются оправдать ИАР.

Кто такой Билл наслышан, Кейла не знаю?

ИАР действует в соответствии со стандартом, а этот результат заложен там.

И это не оправдание, а всего лишь констатация печального факта.

 

 

И Кейл их скомпилировал, как надо.

 

С АРМами пока не работал, но если не ошибаюсь, то Вы компилировали для 16-ти битного режима.

А в нем же uint16_t совпадает с unsigned int, поэтому происходит расширение до rvalue16(temp1).

При этом ~rvalue16(temp1) полностью совпадает с ~temp1.

Изменено пользователем aiwa

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


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

Кейл, он же Кайл, он же Keil (нем.), он же куплен ARM (АРМ), поскольку, как выясняется, компилирует без косяков.

aiwa, ошибаетесь.

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


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

Кейл, он же Кайл, он же Keil (нем.), он же куплен ARM (АРМ), поскольку, как выясняется, компилирует без косяков.

aiwa, ошибаетесь.

Я ничего не утверждаю - увидел в Ваших листингах "THUMB" вот и высказал предположение.

Если он компилирует верно и для 32-разрядного режима, то только можно этому порадоваться.

Есть надежда, что и в стандарт внесут соответствующие изменения.

 

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


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

Правильно, продвигается до знакового целого. Но почему 65534 должно "превратиться в -1?

jcxz, об чем вы, о каких ошибках? Я где хочу,там пишу с ошибками, а компилятор их ловит. Где хочу читаю все ремарки.

Я не знаю о каких ошибках писали Вы. Не узнаёте свои слова? Уже начали отмечать или ещё не закончили? :biggrin:

 

таким, что если бы я хотел написать нечто осмысленное, то использовал ifdef

а так как написан if, то вероятно тут косяк, о коем компилятор обязан сообщить

Ещё раз прочитайте по буквам: причём там ifdef???

Для справки: ifdef - используется для проверки определено ли данное имя или нет.

В моём примере константа всегда определена. Но может принимать разные значения (1, 2, ...).

И то, что там написан if - вполне нормально, а никакой не косяк. Поэтому компилятор правильно и молчит.

В си аргумент оператора if - выражение, которое может состоять из переменных и констант.

На этапе выполнения значение этого выражения вычисляется. На этапе компиляции может осуществляться оптимизация этого выражения.

Варнингов на приведённые мною примеры не должно быть никаких. Что и подтверждает IAR.

 

PS: Тут уже все отмечают что-ль??? :santa2:

 

Почему никто не комментирует листинги от Кейла? Все пытаются оправдать ИАР.

Может потому что его никто не пользует? :)

И зачем оправдывать IAR? Он не выдал варнинг? Так и правильно сделал!

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


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

Кейл, он же Кайл, он же Keil (нем.), он же куплен ARM (АРМ), поскольку, как выясняется, компилирует без косяков.

Да? Именно поэтому сразу после покупки АРМ заменил кейловский убогий компилятор своим (он же RealView)? :biggrin:

Кейл неплохо делает всё остальное (среда, отладчик, поддержка огромного зоопарка МК), но в компиляторах они точно не чемпионы.

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


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

Кейл, он же Кайл, он же Keil (нем.), он же куплен ARM (АРМ), поскольку, как выясняется, компилирует без косяков.

aiwa, ошибаетесь.

Посмотрел Ваш результат компиляции Кейл. Результат этот не делает чести Кейлу - теперь точно не променяю IAR на него! :laughing:

IAR на этапе компиляции правильно оптимизировал выражение выкинув ненужный код.

Кейл-же оставил бессмысленный код. Значение выражения всегда будет "истина".

Так что: MVNS и CMP - лишние, а BEQ надо заменить на безусловный B.

 

С АРМами пока не работал, но если не ошибаюсь, то Вы компилировали для 16-ти битного режима.

А в нем же uint16_t совпадает с unsigned int, поэтому происходит расширение до rvalue16(temp1).

При этом ~rvalue16(temp1) полностью совпадает с ~temp1.

Бред.

В ARM разрядность операций и регистров не зависит от режима - хоть Thumb хоть ARM - всё равно 32 бита.

Режимы ARM и Thumb - определяют только способ кодирования инструкций и их количество.

К тому-же, указанный ТС-ом МК, имеет ядро Cortex-M, которое знает только набор инструкций Thumb2.

Учите матчасть!

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


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

Дополню для ясности. У Cortex-M команды - THUMB2 - смесь 16-битовых и 32пбитовых команд. А регистры, естественно, 32-битовые.

jcxz, я не отмечаю... Но подлечиться не помешает. Перестаю понимать людей.

Что касается Кейла, то он сделал то, что ему задали. Задам ему оптимизацию, посмотрим, что выдаст... Кто чемпион... чем сердце успокоится...

scifi, значит, RealView чемпион. Мне одинаково хорошо.

 

Задал -o3. Но, поскольку temp не volatile, Кейл выкинул всё. В обоих случаях снова все одинаково.

; generated by Component: ARM Compiler 5.06 update 1 (build 61) Tool: ArmCC [4d35ad]
; commandline ArmCC [--c99 --list --split_sections --debug -c --asm --interleave -o.\objects\example1.o --asm_dir=.\Listings\ --list_dir=.\Listings\ --depend=.\objects\example1.d --cpu=Cortex-M3 --apcs=interwork -O3 --diag_suppress=9931 -I"D:\ViKo\Works\Keil works\(Keil) Example\RTE" -I"D:\ViKo\Works\Keil works\(Keil) Example\RTE\Device\STM32F103VC" -IC:\Design\Keil\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include -IC:\Design\Keil\ARM\PACK\Keil\STM32F1xx_DFP\2.1.0\Device\Include -D__UVISION_VERSION=518 -D_RTE_ -DSTM32F10X_HD --omf_browse=.\objects\example1.crf Source\example1.c]
                         THUMB

                         AREA ||i.main||, CODE, READONLY, ALIGN=1

                 main PROC
;;;311    /* end of stdint.h */
;;;3      int main ()
000000  2000              MOVS     r0,#0
                 |L1.2|
;;;4      {
;;;5      uint16_t temp1, temp2;
;;;6      	for (unsigned int i = 0; i < 10; i++)
000002  1c40              ADDS     r0,r0,#1
000004  280a              CMP      r0,#0xa
;;;7      	{
;;;8      		temp1 = 0x0001;
;;;9      		temp2 = 0xFFFE;
;;;10     		if (~temp1 != temp2) continue;
000006  d3fc              BCC      |L1.2|
;;;11     		temp2 = temp1;
;;;12     	}
;;;13     }
000008  2000              MOVS     r0,#0
00000a  4770              BX       lr
                         ENDP


                 __ARM_use_no_argv EQU 0

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


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

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

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

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

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

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

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

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

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

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