Отговори на тема  [ 14 мнения ] 
Not opearator 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Not opearator
Nikola Kirov написа:
Или аз съм оглупял нещо или компилатора на ИАР за STM8 нещо не е у ред.


За първото твърдение нямам достатъчно информация, а за второто колкото и да не долюбвам ИАР-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
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение Re: Not opearator
Питай го компилатора sizeof(int) колко му е. Ако е 2, съвсем нормално се е държал. Макар че STM8 го очаквам да е 8-битов.


Пон Яну 05, 2015 1:07 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение Re: Not opearator
Int на всички 8 битови компилатори които съм пипал е 16 бита.
Но къде гледате че ~ трябва да преобразува типа до 16 бита?

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


Пон Яну 05, 2015 2:16 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Not opearator
Nikola Kirov написа:
Но къде гледате че ~ трябва да преобразува типа до 16 бита?


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

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


Пон Яну 05, 2015 6:29 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение Re: Not opearator
Nikola Kirov написа:
явно ~ се явява функция от типа:
usnisgned int Not(unsigned int);


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

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


Пон Яну 05, 2015 6:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Not opearator
Nikola Kirov написа:
Но не намирам къде да прочета този оператор какви параметри трябва да има според стандарта.


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

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


Пон Яну 05, 2015 7:16 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение Re: Not opearator
Промотирането на типовете е ясно.
Само дето не мога да намеря къде е написано черно на бяло каква е хавата с този и подобните му оператори. Черно на бяло да е написано че това е функция с еди какъв си тип параметър и еди какъв си тип върната стойност.


Пон Яну 05, 2015 9:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение 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


Пон Яну 05, 2015 10:05 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение Re: Not opearator
Да вярно че съм объркал. Просто моя сорс е с доста по сложен пример и това го написах за пример.
Мерси много!
Какво гледах и аз не знам. Сигурно два пъти минах през тоя текст преди и не зацепих за какво става дума.
Като ми каза че там е отговора,чак тогава зацепих какво ми казват :)


Пон Яну 05, 2015 11:00 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Not opearator
Не се притеснявай... и аз в момента съм се омотал като пате в калчища ;-)
А ми беше уж готово, само трябваше да тествам.... Май празниците трябва да ги забранят със закон, че след тях много трудно се зацепва :oops:


Вто Яну 06, 2015 10:02 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 14 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни