| Автор |
Съобщение |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
 Not opearator
Или аз съм оглупял нещо или компилатора на ИАР за STM8 нещо не е у ред.
u8 tmp1 = 0; u8 tmp2 = 0xFF;
if ( tmp1 == ~tmp2 ) // Това условие не е изпълнено { ........... }
u16 tmp = ~tmp8; // това дава 0xFFFF
Никъде не намирам Not оперратора да работи извън границите на типа на променливата.
if ( tmp1 == (u8)~tmp2 ) // Това условие е изпълнено { ........... }
Някой да има идеи?
|
| Пон Яну 05, 2015 12:16 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: Not opearator
За първото твърдение нямам достатъчно информация, а за второто колкото и да не долюбвам ИАР-a, в случая се държи нормално... По принцип истински оператори имаш в Ц++ и там може да си ги дефинираш всякак, докато в С е по-скоро операция и преди всяка операция имаш type promotion... ей ти първия ми попаднал линк
|
| Пон Яну 05, 2015 12:30 pm |
|
 |
|
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 9:14 am Мнения: 5298
|
 Re: Not opearator
Може би всъщност ти трябва логическия Not с удивителната? Аритметичния нот разширява операнда до нужната дължина на приемника (u16 във втория ти пример) и просле просто го инвертира. Първия пример е малко по-труден за разбиране, предполагам, че дефолта за int на конкретния микроконтролер е 16 бита. Ако теста ти беше с !tmp а не ~tmp, нямаше да има проблем, понеже ! връща само 1 или 0 като резултат.
_________________ 'просто' е технически синоним на 'красиво'
|
| Пон Яну 05, 2015 12:36 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
 Re: Not opearator
Питай го компилатора sizeof(int) колко му е. Ако е 2, съвсем нормално се е държал. Макар че STM8 го очаквам да е 8-битов.
|
| Пон Яну 05, 2015 1:07 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
 Re: Not opearator
Int на всички 8 битови компилатори които съм пипал е 16 бита. Но къде гледате че ~ трябва да преобразува типа до 16 бита?
Интересно че тоя трик съм го ползвал другаде с u8 и си е работил.
|
| Пон Яну 05, 2015 2:16 pm |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
 Re: Not opearator
Nikola Kirov трябва да видиш асеблера дето го генерира, за да си сигурен какво и как го прави. По дефиниция int е поне 16 бита, но има и компилатори за които int е 8 битов. Не съм не съм много сигурен при ИАР как е, но е възможно сравняването да го прави u16(tmp1) - u16(~tmp2)
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Пон Яну 05, 2015 3:12 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
 Re: Not opearator
Както казах не съм срещал друго освен 16 бита за 8 битов процесор.
явно ~ се явява функция от типа: usnisgned int Not(unsigned int);
Но не го намирам написано черно на бяло някъде. Ще го имам пред вид за в бъдеще.
Вероятно съм го правил в AVR версията на IAR където има повече изключения от стандарта с цел оптимизация на кода.
|
| Пон Яну 05, 2015 3:50 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: Not opearator
Не трябва да се преобразува до 16 бита, а до int тип, който може да е 16/32/64 бита според това как е настроен компилаторът. По подразбиране int трябва да е възможно "най-удобният" размер за съответната платформа. При всички случаи трябва да се спазва С-стандарта, според който int трябва да е по-голям от char. В линка, който ти дадох от предния пост е обяснено защо се прави прИмоция, като имаш и цитирани съответните стандарти в случай че не ти се вярва 
|
| Пон Яну 05, 2015 6:29 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
 Re: Not opearator
Както казах се ориентирах за типа на аргумента и върнатата стойност. Но не намирам къде да прочета този оператор какви параметри трябва да има според стандарта. За да съм сигурен че винаги ще ми се компилира правилно кода. Преполагам че на всички компилатори ще е unsigned int но ми се иска да го видя черно на бяло,пък не намирам. Не че не мога да го извъртя на всички компилатори които ползвам но е добре да видя и за другите оператори от тоя тип как стои въпроса. Предполагах че е вграден в компилатора и той решава как да направи имплементацията според аргументите но явно си е обикновенна функция.
|
| Пон Яну 05, 2015 6:58 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: Not opearator
Промоцията на типове не е свързана само с този оператор, а е нещо принципно, което се прилага към всички аритметични операции... За повече подробности винаги може да отвориш стандарта, макар и драфт версия, примерно С99. Отваряш и търсиш думичката promotion...
|
| Пон Яну 05, 2015 7:16 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
 Re: Not opearator
Промотирането на типовете е ясно. Само дето не мога да намеря къде е написано черно на бяло каква е хавата с този и подобните му оператори. Черно на бяло да е написано че това е функция с еди какъв си тип параметър и еди какъв си тип върната стойност.
|
| Пон Яну 05, 2015 9:04 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: Not opearator
Стандарта от горния линк, стр.79 Между другото пак погледнах примера ти, объркал си малко променливите, иначе 0xFF промотирано до int е 0x00FF инвертирано е 0xFF00 и това е различно от 0x00 (0x0000). Но 0xFF00 кастнато до 8-бит е 0x00 и е равно на 0х00
|
| Пон Яну 05, 2015 10:05 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
 Re: Not opearator
Да вярно че съм объркал. Просто моя сорс е с доста по сложен пример и това го написах за пример. Мерси много! Какво гледах и аз не знам. Сигурно два пъти минах през тоя текст преди и не зацепих за какво става дума. Като ми каза че там е отговора,чак тогава зацепих какво ми казват 
|
| Пон Яну 05, 2015 11:00 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: Not opearator
Не се притеснявай... и аз в момента съм се омотал като пате в калчища  А ми беше уж готово, само трябваше да тествам.... Май празниците трябва да ги забранят със закон, че след тях много трудно се зацепва 
|
| Вто Яну 06, 2015 10:02 am |
|
|