Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Not opearator
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=13479
Страница 1 от 1

Автор:  Nikola Kirov [ Пон Яну 05, 2015 12:16 pm ]
Заглавие:  Not opearator

Или аз съм оглупял нещо или компилатора на ИАР за STM8 нещо не е у ред.

u8 tmp1 = 0;
u8 tmp2 = 0xFF;

if ( tmp1 == ~tmp2 ) // Това условие не е изпълнено
{
...........
}

u16 tmp = ~tmp8; // това дава 0xFFFF

Никъде не намирам Not оперратора да работи извън границите на типа на променливата.


if ( tmp1 == (u8)~tmp2 ) // Това условие е изпълнено
{
...........
}

Някой да има идеи?

Автор:  miro_atc [ Пон Яну 05, 2015 12:30 pm ]
Заглавие:  Re: Not opearator

Nikola Kirov написа:
Или аз съм оглупял нещо или компилатора на ИАР за STM8 нещо не е у ред.


За първото твърдение нямам достатъчно информация, а за второто колкото и да не долюбвам ИАР-a, в случая се държи нормално...

По принцип истински оператори имаш в Ц++ и там може да си ги дефинираш всякак, докато в С е по-скоро операция и преди всяка операция имаш type promotion... ей ти първия ми попаднал линк

Автор:  Н'бабане Гт'муан'га [ Пон Яну 05, 2015 12:36 pm ]
Заглавие:  Re: Not opearator

Може би всъщност ти трябва логическия Not с удивителната? Аритметичния нот разширява операнда до нужната дължина на приемника (u16 във втория ти пример) и просле просто го инвертира. Първия пример е малко по-труден за разбиране, предполагам, че дефолта за int на конкретния микроконтролер е 16 бита. Ако теста ти беше с !tmp а не ~tmp, нямаше да има проблем, понеже ! връща само 1 или 0 като резултат.

Автор:  bateAz [ Пон Яну 05, 2015 1:07 pm ]
Заглавие:  Re: Not opearator

Питай го компилатора sizeof(int) колко му е. Ако е 2, съвсем нормално се е държал. Макар че STM8 го очаквам да е 8-битов.

Автор:  Nikola Kirov [ Пон Яну 05, 2015 2:16 pm ]
Заглавие:  Re: Not opearator

Int на всички 8 битови компилатори които съм пипал е 16 бита.
Но къде гледате че ~ трябва да преобразува типа до 16 бита?

Интересно че тоя трик съм го ползвал другаде с u8 и си е работил.

Автор:  ike [ Пон Яну 05, 2015 3:12 pm ]
Заглавие:  Re: Not opearator

Nikola Kirov трябва да видиш асеблера дето го генерира, за да си сигурен какво и как го прави.
По дефиниция int е поне 16 бита, но има и компилатори за които int е 8 битов.
Не съм не съм много сигурен при ИАР как е, но е възможно сравняването да го прави
u16(tmp1) - u16(~tmp2)

Автор:  Nikola Kirov [ Пон Яну 05, 2015 3:50 pm ]
Заглавие:  Re: Not opearator

Както казах не съм срещал друго освен 16 бита за 8 битов процесор.

явно ~ се явява функция от типа:
usnisgned int Not(unsigned int);

Но не го намирам написано черно на бяло някъде.
Ще го имам пред вид за в бъдеще.

Вероятно съм го правил в AVR версията на IAR където има повече изключения от стандарта с цел оптимизация на кода.

Автор:  miro_atc [ Пон Яну 05, 2015 6:29 pm ]
Заглавие:  Re: Not opearator

Nikola Kirov написа:
Но къде гледате че ~ трябва да преобразува типа до 16 бита?


Не трябва да се преобразува до 16 бита, а до int тип, който може да е 16/32/64 бита според това как е настроен компилаторът. По подразбиране int трябва да е възможно "най-удобният" размер за съответната платформа. При всички случаи трябва да се спазва С-стандарта, според който int трябва да е по-голям от char.

В линка, който ти дадох от предния пост е обяснено защо се прави прИмоция, като имаш и цитирани съответните стандарти в случай че не ти се вярва ;-)

Автор:  Nikola Kirov [ Пон Яну 05, 2015 6:58 pm ]
Заглавие:  Re: Not opearator

Nikola Kirov написа:
явно ~ се явява функция от типа:
usnisgned int Not(unsigned int);


Както казах се ориентирах за типа на аргумента и върнатата стойност. Но не намирам къде да прочета този оператор какви параметри трябва да има според стандарта. За да съм сигурен че винаги ще ми се компилира правилно кода. Преполагам че на всички компилатори ще е unsigned int но ми се иска да го видя черно на бяло,пък не намирам.

Не че не мога да го извъртя на всички компилатори които ползвам но е добре да видя и за другите оператори от тоя тип как стои въпроса. Предполагах че е вграден в компилатора и той решава как да направи имплементацията според аргументите но явно си е обикновенна функция.

Автор:  miro_atc [ Пон Яну 05, 2015 7:16 pm ]
Заглавие:  Re: Not opearator

Nikola Kirov написа:
Но не намирам къде да прочета този оператор какви параметри трябва да има според стандарта.


Промоцията на типове не е свързана само с този оператор, а е нещо принципно, което се прилага към всички аритметични операции...

За повече подробности винаги може да отвориш стандарта, макар и драфт версия, примерно С99. Отваряш и търсиш думичката promotion...

Автор:  Nikola Kirov [ Пон Яну 05, 2015 9:04 pm ]
Заглавие:  Re: Not opearator

Промотирането на типовете е ясно.
Само дето не мога да намеря къде е написано черно на бяло каква е хавата с този и подобните му оператори. Черно на бяло да е написано че това е функция с еди какъв си тип параметър и еди какъв си тип върната стойност.

Автор:  miro_atc [ Пон Яну 05, 2015 10:05 pm ]
Заглавие:  Re: Not opearator

Стандарта от горния линк, стр.79

Цитат:
The result of the ~ operator is the bitwise complement of its (promoted) operand (that is,
each bit in the result is set if and only if the corresponding bit in the converted operand is
not set). The integer promotions are performed on the operand, and the result has the
promoted type


Между другото пак погледнах примера ти, объркал си малко променливите, иначе 0xFF промотирано до int е 0x00FF инвертирано е 0xFF00 и това е различно от 0x00 (0x0000). Но 0xFF00 кастнато до 8-бит е 0x00 и е равно на 0х00

Автор:  Nikola Kirov [ Пон Яну 05, 2015 11:00 pm ]
Заглавие:  Re: Not opearator

Да вярно че съм объркал. Просто моя сорс е с доста по сложен пример и това го написах за пример.
Мерси много!
Какво гледах и аз не знам. Сигурно два пъти минах през тоя текст преди и не зацепих за какво става дума.
Като ми каза че там е отговора,чак тогава зацепих какво ми казват :)

Автор:  miro_atc [ Вто Яну 06, 2015 10:02 am ]
Заглавие:  Re: Not opearator

Не се притеснявай... и аз в момента съм се омотал като пате в калчища ;-)
А ми беше уж готово, само трябваше да тествам.... Май празниците трябва да ги забранят със закон, че след тях много трудно се зацепва :oops:

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/