| Микроконтролери и електроника 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 | |||||||||
За първото твърдение нямам достатъчно информация, а за второто колкото и да не долюбвам ИАР-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 | |||||||||
Не трябва да се преобразува до 16 бита, а до int тип, който може да е 16/32/64 бита според това как е настроен компилаторът. По подразбиране int трябва да е възможно "най-удобният" размер за съответната платформа. При всички случаи трябва да се спазва С-стандарта, според който int трябва да е по-голям от char. В линка, който ти дадох от предния пост е обяснено защо се прави прИмоция, като имаш и цитирани съответните стандарти в случай че не ти се вярва |
||||||||||
| Автор: | Nikola Kirov [ Пон Яну 05, 2015 6:58 pm ] | |||||||||
| Заглавие: | Re: Not opearator | |||||||||
Както казах се ориентирах за типа на аргумента и върнатата стойност. Но не намирам къде да прочета този оператор какви параметри трябва да има според стандарта. За да съм сигурен че винаги ще ми се компилира правилно кода. Преполагам че на всички компилатори ще е unsigned int но ми се иска да го видя черно на бяло,пък не намирам. Не че не мога да го извъртя на всички компилатори които ползвам но е добре да видя и за другите оператори от тоя тип как стои въпроса. Предполагах че е вграден в компилатора и той решава как да направи имплементацията според аргументите но явно си е обикновенна функция. |
||||||||||
| Автор: | miro_atc [ Пон Яну 05, 2015 7:16 pm ] | |||||||||
| Заглавие: | Re: Not opearator | |||||||||
Промоцията на типове не е свързана само с този оператор, а е нещо принципно, което се прилага към всички аритметични операции... За повече подробности винаги може да отвориш стандарта, макар и драфт версия, примерно С99. Отваряш и търсиш думичката promotion... |
||||||||||
| Автор: | Nikola Kirov [ Пон Яну 05, 2015 9:04 pm ] |
| Заглавие: | Re: Not opearator |
Промотирането на типовете е ясно. Само дето не мога да намеря къде е написано черно на бяло каква е хавата с този и подобните му оператори. Черно на бяло да е написано че това е функция с еди какъв си тип параметър и еди какъв си тип върната стойност. |
|
| Автор: | miro_atc [ Пон Яну 05, 2015 10:05 pm ] | |||||||||
| Заглавие: | Re: Not opearator | |||||||||
Стандарта от горния линк, стр.79
Между другото пак погледнах примера ти, объркал си малко променливите, иначе 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 |
Не се притеснявай... и аз в момента съм се омотал като пате в калчища А ми беше уж готово, само трябваше да тествам.... Май празниците трябва да ги забранят със закон, че след тях много трудно се зацепва |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|